PHP配列ソートアルゴリズムの概要

WBOY
リリース: 2016-06-20 13:05:12
オリジナル
791 人が閲覧しました

PHP での配列の要素のソートは非常に頻繁に使用され、以前のプロジェクトでも使用されていますが、私たちは皆、asort や arsort などの PHP ネイティブ関数を使用しています。以下にいくつかの機能を追加しますので、ご自身で見直して要約することもできます。

/*
 * 插入排序(一维数组)
 * 每次将一个待排序的数据元素,插入到前面已经排好序的数列中的适当的位置,使数列依然有序;直到待排序的数据元素全部插入完成为止。
 */
function insertSort($arr){
    if(!is_array($arr) ||count($arr)==0){
        return $arr;
    }
    $count =count($arr);
    for($i=1;$i<$count;$i++){
        if(isset($arr[$i])){
       $tmp =$arr[$i];//获取后一个元素的值
       $j =$i - 1;//获取前面的下标
       while($arr[$j] >$tmp){//如果前面一个比后面一个大, 这里是从小到大
           $arr[$j+1] =$arr[$j];//把小的元素和前面的对换,直到移动到合适的位置,在移动下一个
           $arr[$j] =$tmp;
           $j--;
        }
        }
    }
    return $arr;
}
/*
 * 选择排序(一维数组)
 * 每一趟从待排序的数据元素中选出最小(最大)的一个元素,顺序放在已排好序的数列的最后,直到全部待排序的数据元素排完。
 */
function selectSort($arr){
    if(!is_array($arr) ||count($arr) == 0)
    {
        return $arr;
    }
    $count =count($arr);
    for($i=0;$i<$count;$i++){
        $k =$i;
        for($j=$i+1;$j<$count;$j++){
      if ($arr[$k] >$arr[$j])
        $k =$j;//找出最小的
       if ($k !=$i){
           $tmp =$arr[$i];
           $arr[$i] =$arr[$k];
           $arr[$k] =$tmp;
          }
       }
    }
    return $arr;
}
 
/*  
 * 冒泡排序(一维数组)
 * 两两比较待排序数据元素的大小,发现两个数据元素的次序相反即进行交换,直到没有反序的数据元素为止
 */
function bubbleSort($array){
    $count =count($array);
    if ($count <= 0) {
        return false;
    }
    for($i=0;$i<$count;$i++){
        for($j=$count-1;$j>$i;$j--){
           if ($array[$j] <$array[$j-1]){//比较找到的数进行交换
            $tmp =$array[$j];
            $array[$j] =$array[$j-1];
            $array[$j-1] =$tmp;
           }
        }
    }
    return $array;
}
/*
 * 快速排序(一维数组)
 *
 */
function quickSort($array){
    if (count($array) <= 1){
        return $array;
    }
    $key =$array[0];
    $left_arr =array();
    $right_arr =array();
    for ($i=1;$i<count($array);$i++){
      if ($array[$i] <=$key){
           $left_arr[] =$array[$i];
      }else{
         $right_arr[] =$array[$i];
        }
    }
    $left_arr = quickSort($left_arr);
    $right_arr = quickSort($right_arr);
    return array_merge($left_arr,array($key),$right_arr);
}
 
/**
  * 按照元素的值进行排序
  * strOrder 为排列的顺序 asc 升序  desc 降序
  */
function sortByVal($arr,$strOrder=&#39;asc&#39;)
{
    if(!is_array($arr) ||count($arr)==0)
    {
        return $arr;
    }
 
    $arrReturn =array();
    foreach($arr as $key=>$val)
    {
        $arrKey[] =$key;
        $arrVal[] =$val;
    }
 
    $count =count($arrVal);
    if($count)
    {
        //创建key的顺序数组
        for($key=0;$key<$count;$key++)
        {
            $arrKeyMap[$key] =$key; 
        }
        //对值进行排序
        for($i=0;$i<$count;$i++)
        {  
             
            for($j =$count-1;$j>$i;$j--)
            {
                //<从小到大排列 升降在这修改
                $bol =$strOrder ==&#39;asc&#39; ?$arrVal[$j]<$arrVal[$j-1] :$arrVal[$j]>$arrVal[$j-1];
                if($bol){
                    $tmp =$arrVal[$j];
                    $arrVal[$j] =$arrVal[$j-1];
                    $arrVal[$j-1] =$tmp;
                    //值的冒泡排序,引起key的数组的交互   
                    $keytmp =$arrKeyMap[$j];
                    $arrKeyMap[$j] =$arrKeyMap[$j-1];
                    $arrKeyMap[$j-1] =$keytmp;
                }
            }
        }
        if(count($arrKeyMap))
        {
            foreach ($arrKeyMap as $val)
            {
                    $arrReturn[] =$arrKey[$val];
            }
        }
        return $arrReturn;
    }
}
 
 
/**
  * 使用原生的函数进行数组按照值进行排列
  */
function arraySortByVal($arr,$keys,$type=&#39;asc&#39;){
    $keysvalue =$new_array =array();
    foreach ($arr as $k=>$v){
        $keysvalue[$k] =$v[$keys];
    }
    if($type ==&#39;asc&#39;){
        asort($keysvalue);
    }else{
        arsort($keysvalue);
    }
    reset($keysvalue);
    foreach ($keysvalue as $k=>$v){
        $new_array[$k] =$arr[$k];
    }
    return $new_array;
ログイン後にコピー

配列値をソートする次の 2 つの方法では、1 つは独自に実装され、もう 1 つはネイティブの PHP 関数を使用します。実際、少量のデータ (通常は 1 ページのデータ) であればソートが可能です。大量のデータのソートを伴う場合は、それを MYSQL の基本クラスに統合することをお勧めします。


関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート