那么,首先, " /> 日本人与物videos另类,国产成 人 综合 亚洲网,我看黄色片

一区二区久久-一区二区三区www-一区二区三区久久-一区二区三区久久精品-麻豆国产一区二区在线观看-麻豆国产视频

php實(shí)現(xiàn)的常見排序算法匯總

本文匯總了常見的php排序算法,在進(jìn)行算法設(shè)計(jì)的時(shí)候有不錯(cuò)的借鑒價(jià)值。現(xiàn)分享給大家供參考之用。具體如下:

一、插入排序

用文字簡(jiǎn)單的描述,比如說$arr = array(4,2,4,6,3,6,1,7,9); 這樣的一組數(shù)字進(jìn)行順序排序:
那么,首先,拿數(shù)組的第二個(gè)元素和第一元素比較,假如第一個(gè)元素大于第二元素,那么就讓兩者位置互換,接下來,拿數(shù)組的第三個(gè)元素,分別和第二個(gè),第一個(gè)元素比較,假如第三個(gè)元素小,那么就互換。依次類推。這就是插入排序,它的時(shí)間頻度是:1+2+...+(n-1)=(n^2)/2。則它的時(shí)間復(fù)雜度為O(n^2).

php實(shí)現(xiàn)代碼如下:

<?phpfunction insertSort($arr){   $count = count($arr);   if($count<2){  return $arr;    }   for($i=1;$i<$count;$i++){   $tmp = $arr[$i];   $j=$i-1;   while(j>=0&&$arr[$j]<$arr[$i]){  $arr[$i] = $arr[$j];             $arr[$j] = $tmp;  $j--;   }    }    return $arr;  }?>

二、選擇排序

選擇排序用語(yǔ)言描述的話,可以這樣,如:$arr = array(4,3,5,2,1);

首先,拿第一個(gè)和后面所有的比,找出最小的那個(gè)數(shù)字,然后和第一個(gè)數(shù)組互換(當(dāng)然,如果是第一個(gè)最小,那么就不用互換了),接著循環(huán),即:拿第二個(gè)和后面的比較,找出最小的數(shù)字,然后和第二個(gè)數(shù)字互換,依次類推,也就是說每次都是找出剩余最小的值。 可得到:第一次,時(shí)間頻度 是n, (第一個(gè)和后面的n-1個(gè)比較,找到最小的,再看是不是第一個(gè),不是第一個(gè)的話進(jìn)行互換) 在往后,依次是 減一 。 它的時(shí)間復(fù)雜度,也是O(n^2);

php實(shí)現(xiàn)代碼如下:

<?phpfunction selectSort($arr){   $count = count($arr);   if($count<2){  return $arr;    }   for($i=0;$i<$count;$i++){   $min=$i;   for(j=$i+1;$j<$count;$j++){  if($arr[$min]>$arr[$j]){    $min = $j; //找到最小的那個(gè)元素的下標(biāo)  }   }   if($min!=$i){//如果下標(biāo)不是$i 則互換。   $tmp= $arr[$i];               $arr[$i] = $arr[$min];    $arr[$min] = $tmp;    }    }    return $arr;  }?>

三、冒泡排序  
    
冒泡排序其實(shí)上是和選擇排序相比,并無(wú)明顯差別。都是找到最小的,放到最左端。依次循環(huán)解決問題。差別在于冒泡排序的交換位置的次數(shù)較多,而選擇排序則是找到最小的元素的下標(biāo),然后直接和最左端的交換位置。


php實(shí)現(xiàn)代碼如下:

<?phpfunction selectSort($arr){   $count = count($arr);   if($count<2){  return $arr;    }   for($i=0;$i<$count;$i++){   for(j=$i+1;$j<$count;$j++){  if($arr[$i]>$arr[$j]){    $tmp= $arr[$i];               $arr[$i] = $arr[$i];    $arr[$i] = $tmp;  }   }    }    return $arr;  }?>

四、快速排序

快速排序,用語(yǔ)言來形容的話,從數(shù)組中選擇一個(gè)值$a,然后和其余元素進(jìn)行比較,比$a大的放到數(shù)組right中,反之,放到數(shù)組left中。然后將left right 分別進(jìn)行遞歸調(diào)用,即:再細(xì)分left right ,最后進(jìn)行數(shù)組的合并。

php實(shí)現(xiàn)快速排序:

<?phpfunction mySort($arr){   $count = count($arr);   if($count<2){  return $arr;    }   $key = $arr[0];//選擇第一個(gè)元素作為比較元素,可選其他    $left = array();           $right = array();    for($i=1;$i<$count;$i++){   if($key>=$arr[$i]){  $left[] = $arr[$i];    }else{  $right[] = $arr[$i];    }    }    $left = mySort($left);    $right = mySort($right);    $result = array_merge($left,$right);    return $result;  }?>

五、歸并排序

其實(shí)歸并排序是一種拆分,合并的思想。和快速排序思想有共通之處,左邊一堆,右邊一堆,然后進(jìn)行合并。通過遞歸實(shí)現(xiàn)排序。 區(qū)別之處呢?  他們的區(qū)別也是思想上本質(zhì)的區(qū)別,快速排序的拆分,是選擇了特定的值進(jìn)行大小比較,從而分為left 和 right 。也就是小的一堆放入left,大的一堆放入right。而后,小的left 再細(xì)分為left1  right1。。。。通過進(jìn)行類似的遞歸完成排序。也就是說,一直細(xì)分下去,遞歸最末尾的left1就是最小值。

而歸并排序,是從幾何上的左右切分,一直遞歸切分成2或者1的最小粒度的數(shù)組,然后才開始進(jìn)行比較大小,然后合并。此處的比較大小是:兒子left的元素 和兒子的right元素 進(jìn)行比較,而后進(jìn)行排序合并成為父親left或者right。在此,直到拿到各自排序合并完成最后兩個(gè)數(shù)組:最起初的left 和right,也僅僅直到他們各自的順序,并不能確認(rèn)整個(gè)數(shù)組的順序,還是需要通過最終的left right 比較后合并才能完成真正意義上的排序。

<?phpfunction gbSort($arr){    if(count($arr)<=1){return $arr;}    $min = floor(count($arr)/2);//取中間數(shù)字進(jìn)行拆分    $left = array_slice($arr,0,$min);    $right = array_slice($arr,$min);    $left = gbSort($left); //遞歸    $right = gbSort($right);    return get_merge($left,$right);//調(diào)用排序合并函數(shù)進(jìn)行合并}function get_merge($left,$right){    while(count($left) && count($right)){        $m[] = $left[0]>$right[0] ? array_shift($right) : array_shift($left);        //進(jìn)行比較,小的移除,并且放入到數(shù)組$m中。    }    return arr_merge($m,$left,$right);//進(jìn)行合并(由于不知道left right 哪個(gè)會(huì)為空,所以進(jìn)行統(tǒng)一合并)}?>

六、堆排序

本例中fixDown函數(shù)實(shí)現(xiàn)對(duì)某一個(gè)節(jié)點(diǎn)的向下調(diào)整,這里默認(rèn)的是起始節(jié)點(diǎn)為1,方便計(jì)算父子節(jié)點(diǎn)關(guān)系

注:

起始節(jié)點(diǎn)為1的父子關(guān)系: 父節(jié)點(diǎn)k, 子節(jié)點(diǎn)為2K、2k+1     子節(jié)點(diǎn)j, 父節(jié)點(diǎn)為 floor(j/2)  floor為向下取整
起始節(jié)點(diǎn)為0的父子關(guān)系: 父節(jié)點(diǎn)k, 子節(jié)點(diǎn)為2K+1, 2k+2   子節(jié)點(diǎn)j, 父節(jié)點(diǎn)為 floor((j-1)/2)

參數(shù)$k為調(diào)整點(diǎn)位置, $lenth為數(shù)組長(zhǎng)度,也就是從1起始到最后一個(gè)節(jié)點(diǎn)的坐標(biāo).

<?phpfunction fixDown(&$arr, $k, $lenth){  while(2*$k<=$lenth) { //只要當(dāng)前節(jié)點(diǎn)有子節(jié)點(diǎn), 就需要繼續(xù)該循環(huán)    $j = $k*2;    if ($j<$lenth && $arr[$j]<$arr[$j+1]) $j++;  // 只要子節(jié)點(diǎn)有右節(jié)點(diǎn),且右節(jié)點(diǎn)比左節(jié)點(diǎn)大,那么切換到右節(jié)點(diǎn)操作。    if ($arr[$j] < $arr[$k]) break; // 如果子節(jié)點(diǎn)都沒有父節(jié)點(diǎn)大, 那么調(diào)整結(jié)束。    exch($arr[$j], $arr[$k]);     $k = $j;  }}function exch(&$a, &$b) {  $tmp = $a; $a = $b; $b = $tmp;}function headSort(&$arr){  $len = count($arr);  array_unshift($arr, NULL);  for($i=$len/2;$i>=1;$i--) {    fixDown($arr, $i, $len);  }  while($len>1) {    exch($arr[1], $arr[$len]);    fixDown($arr, 1, --$len);  }  array_shift($arr);}$arr = array(4,6,4,9,2,3);headSort($arr);?>

希望本文所述排序算法實(shí)例對(duì)大家的php程序設(shè)計(jì)有所幫助。

php技術(shù)php實(shí)現(xiàn)的常見排序算法匯總,轉(zhuǎn)載需保留來源!

鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。

主站蜘蛛池模板: 国产不卡一区二区三区免费视 | 精品新一区二区三区四区 | 伊人网综合在线观看 | 91午夜精品午夜剧场 | 成年女人男人免费视频播放 | 夜夜未满十八勿进的爽爽影院 | 漂亮大学生一级毛片 | 热久久视久久精品18国产 | 玖玖国产在线 | 欧美日韩亚洲国产千人斩 | 国产精品视频观看 | 性欧美在线观看 | 亚洲国产99999在线精品一区 | 国产免费久久精品99久久 | 伊人福利视频 | 一区二区三区四区在线视频 | 欧美日韩国产亚洲综合不卡 | 69视频免费观看 | 国产精品网页 | 欧美人善zozσ性伦交 | 99久久中文字幕伊人 | 一本久道久久综合婷婷 | 色综合成人 | 久久99精品久久久久久青青91 | 国内精品一区二区2021在线 | 黄色影片免费观看 | 亚洲视频成人 | 色偷偷亚洲女人天堂观看欧 | 欧美a级片免费看 | 欧美精品免费一区欧美久久优播 | 久久国产自偷自偷免 | 欧美专区视频 | 亚洲人成绝费网站色ww | 一本大道加勒比久久综合 | 亚洲精品大片 | 91麻豆国产香蕉久久精品 | 国产一区二区高清在线 | 久久国产影视免费精品 | 麻豆亚洲一区 | 91青青国产在线观看免费 | 天天干天天干天天 |