PHP常见排序算法

时间:2022-02-24 08:58:20
$a = [1, 3, 5, 2, 4, 6, 12, 60, 45, 10, 32];
$len = count($a);
$num=0; /*
* 冒泡排序
* 原理:不停的对相邻两个数进行比较,直到最大的数冒出来,重复该过程
*
*/
for ($i = 0; $i < $len-1; $i++) {
for ($j=0;$j<$len-1;$j++){
if($a[$j] <$a[$j+1] ){
$temp=$a[$j];
$a[$j]=$a[$j+1];
$a[$j+1]=$temp; }
}
} /*
* 直接插入排序
* 原理:当前插入位置之前的元素有序
* 若插入当前位置的元素比有序元素最后一个元素大,则什么也不做
* 否则在有序序列中找到插入的位置,并插入
*
*/
for($i=0;$i<$len-1;$i++){
if ($a[$i]>$a[$i+1]){
for ($j=$i;$j>=0;$j--){
if($a[$j]>$a[$j+1]){
$temp=$a[$j+1];
$a[$j+1]=$a[$j];
$a[$j]=$temp;
$num++;
}else{
break;
}
}
}
} /*
* 简单选择排序
* 原理:从数组第一个元素开始依次确定从小到大的元素
*/
for ($i=0;$i<$len-1;$i++){
$k=$i;
for($j=$i+1;$j<$len;$j++){
if($a[$k] > $a[$j] ){
$k=$j;
}
}
if ($k!= $i){
$temp=$a[$k];
$a[$k]=$a[$i];
$a[$i]=$temp;
}
} /*
* 希尔排序
* 原理:将数组按指定步长分隔成若干子序列,然后分别对子序列进行排序(在这是直接)
*/
$k = floor($len / 2); while ($k>0) {
for ($i = 0; $i < $k; $i++) {
for ($j = $i; $j < $len && $j + $k < $len; $j = $j + $k) {
if ($a[$j] > $a[$j + $k]) {
$temp = $a[$j + $k];
$a[$j + $k] = $a[$j];
$a[$j] = $temp;
}
$num++;
}
$k=floor($k/2);
}
} //快速排序和归并排序的整体思想是先拆分在合并 /*
* 快速排序
* 原理:通过一趟排序将待排的记录分为两个独立的部分,其中一部分的记录的关键字均不大于
* 另一部分记录的关键字,然后再分别对这两部分记录继续进行快速排序,以达到整个序列有序,具体做法需要
* 每趟排序设置一个标准关键字和分别指向头一个记录的关键字和最后一个记录的关键字的指针。
*
*/ function quickSort2($array){
if (!isset($array[1]))
return $array;
$mid=$array[0];
$leftArray=[];
$rightArray=[];
foreach ($array as $k=>$v){
if($v>=$mid && $k!=0 ){
$rightArray[]=$v;
}
if($v<$mid){
$leftArray[]=$v;
}
}
$leftArray=quickSort2($leftArray);
$leftArray[]=$mid;
$rightArray=quickSort2($rightArray);
return array_merge($leftArray,$rightArray);
} /*
* 归并排序
* 原理:将数组拆分成两个独立的部分,然后在对独立的部分进行归并排序,它和快速排序的区别在于儿子的左边和儿子
* 的右边进行比较,然后合并成父left或父right
*/
function mergeSort($array){
$k=floor(count($array)/2);
if (!isset($array[1]))
return $array;
$leftArray=mergeSort(array_slice($array,0,$k));
$rightArray=mergeSort(array_slice($array,$k)); while (count($leftArray) && count($rightArray) ){
$m[]= ($leftArray[0] > $rightArray[0]) ? array_shift($rightArray) : array_shift($leftArray);
} return array_merge($m,$leftArray,$rightArray);
}