PHP 經典排序

2021-08-19 17:51:37 字數 4396 閱讀 3917

<?php/**

* created by phpstorm.

* user: 63448

* date: 2018/5/5

* time: 22:42

*/$arr

= [3,1

,13,5

,7,11

,2,4

,14,9

,150,6

,12,10

,8];

// 氣泡排序

/*** 思路分析:在要排序的一組數中,對當前還未排好的序列,從前往後對相鄰的兩個數依次進行比較和調整,

* 讓較大的數往下沉,較小的往上冒。即,每當兩相鄰的數比較後發現它們的排序與排序要求相反時,

* 就將它們互換。**實現:

*/functionbubblesort

($arr) }

}return$arr;}

var_dump(bubblesort(

$arr));

/*** 2.選擇排序

*思路分析:在要排序的一組數中,選出最小的乙個數與第乙個位置的數交換。

* 然後在剩下的數當中再找最小的與第二個位置的數交換,如此迴圈到倒數第二個數和最後乙個數比較為止。

*/functionchoicesort

($arr) }

$arr

[$ipos

] =

$arr[$i

]; // 把當前值放到算好的位置

$arr[$i

] =

$itemp

; // 把當前值換成算好的值

}return$arr;}

var_dump(choicesort(

$arr));

/*** 3.插入排序

*思路分析:在要排序的一組數中,假設前面的數已經是排好順序的,現在要把第n個數插到前面的有序數中,

* 使得這n個數也是排好順序的。如此反覆迴圈,直到全部排好順序。

*/functioninsertsort

($arr

)$arr

[$ipos+1

] =

$itemp;}

return$arr;}

var_dump(insertsort(

$arr));

/*** 4.快速排序

*思路分析:選擇乙個基準元素,通常選擇第乙個元素或者最後乙個元素。

* 通過一趟掃瞄,將待排序列分成兩部分,一部分比基準元素小,一部分大於等於基準元素。

* 此時基準元素在其排好序後的正確位置,然後再用同樣的方法遞迴地排序劃分的兩部分。

*/functionquicksort

($arr

)else

}// 如果左索引有值 則對左索引排序

if(

$l > 1)

// 排序後的陣列

$new_arr

= $left

;// 將當前陣列第乙個放到最後

$new_arr

= $arr[0

];// 如果又索引有值 則對右索引排序

if(

$r > 1)

// 根據右索引的長度再次增加資料

for(

$i = 0;

$i <

$r;

$i++)

return$new_arr;}

var_dump(quicksort(

$arr));

/*** 5.希爾排序

* 思路分析:將陣列按指定步長分隔成若干子串行,然後分別對子序列進行排序(在這是直接)

*/functionshellsort

($arr) }

}$k

= floor($k/

2);}

return$arr;}

var_dump(shellsort(

$arr));

/*** 6.堆排序

* 思路分析:調整子堆的為大根堆的過程

*@param

array &$arr 陣列

*@param

int $s 子堆的根的位置

*@param

int $m 堆最後乙個元素位置

*@return

array

*/functionheapadjust

(&$arr

, $s

, $m

)if(

$tmp

>=

$arr[$j

] )

$arr[$s

] =

$arr[$j

];$s = $j;

}$arr[$s

] =

$tmp;}

// 堆排序

functionheapsort

($arr

) // 依次把根節點調換至最後乙個位置,再次調整堆為大根堆,找到次最大值,

// 依次類推得到乙個有序陣列

for(

$n =

$len-1

; $n

> 0;

$n--)

return$arr;}

var_dump(heapsort(

$arr));

/*** 7.交換法排序

*@param

array $arr

*@return

array

*/functionswapsort

($arr)}

}return$arr;}

var_dump(swapsort(

$arr));

/*** 8.歸併排序

* 思路分析:這裡實現的是兩路歸併(分別將有序的arr1[s..m]、arr2[m+1..n]歸併為有序的$arr2[s..n])

*@param

array &$arr1

*@param

array &$arr2

*@param

int $s

*@param

int $m

*@param

int $n

*/functionmerge

(&$arr1, &

$arr2

, $s

, $m

, $n

)else

}if(

$i <=

$m)

}else if(

$j <=

$n) }}

//遞迴形式的兩路歸併

functionmsort

(&$arr1, &

$arr2

, $s

, $t

)else

}// *對一位陣列$arr[0..n-1]中的元素進行兩路歸併

functionmergesort

($arr

) var_dump(mergesort(

$arr));

//氣泡排序

////選擇排序

////插入排序

////希爾排序

////歸併排序

////快速排序

////堆排序

////計算排序

////桶排序

////基數排序

經典排序 氣泡排序

氣泡排序思想介紹 核心思想 相鄰兩個數之間比較,把大的數往右換,最終每經過一次內層迴圈,就把當前未排序的陣列的最大值換到最右邊去了 如果是從大到小排序,就把小的數往右換,換到最後那個數就是最小的 時間複雜度 氣泡排序的時間複雜度為o n 2 很好理解,內外層迴圈 下面貼上 void bubble s...

經典排序 氣泡排序

所謂 氣泡排序 可以從名稱上理解 以從小到大來舉例,冒泡 實際上就是指把值更大的元素放到數列的後面 如果是從大到小排列,則反之 通過交換來實現。我們先來大致地看下面的 感受一下氣泡排序的執行過程 氣泡排序 includeusing namespace std void bubblesort int ...

經典排序 計數排序

找到待排序列中最大最小的元素,然後以此確定臨時空間的大小,在臨時空間中,以待排序列組中元素的大小為下標,該元素出現的次數為該下標對應的元素,根據臨時空間的統計結果,重新對元素進行 把temp裡的資料 到原空間裡 for i 0 i free temp void count sort int arr,...