php实现几个排序算法

 1 /** 
 2  * 冒泡排序的原理:
 3  *
 4  * 在一组无序的数组中,从前往后对每相邻的两个元素进行比较,
 5  * 大的向下沉(即往后排),小的向上浮(即往前排)
 6  */
 7 function bubbleSort($arr)
 8 {
 9     if (count($arr) <= 0) {
10         return;
11     }
12     // 数组的长度,取出来作为一个固定值
13     $len = count($arr);
14     // 外层循环控制需要冒泡的轮数
15     for ($i = 1; $i < $len; $i++) {
16         // 内层循环控制每轮要比较的次数
17         for ($j = 0; $j < $len - 1 - $i; $j++) {
18             // 进行比较,大的数往下沉,小的往上浮
19             if ($arr[$j] > $arr[$j+1]) {
20                 $temp = $arr[$j];
21                 $arr[$j] = $arr[$j+1];
22                 $arr[$j+1] = $temp;
23             }
24         }
25     }
26 
27     // 从小到大排好序的数组
28     return $arr;
29 }
 1 /**
 2  * 选择排序的原理:
 3  *
 4  * 在要排序的数组中,先找到数组中    最小的元素,放到数组的第一个位置,
 5  * 然后在剩下的元素中再找到最小的一个放到数组的第二个位置,直到循
 6  * 环到最后两个相比较出大小为止
 7  */
 8 function selectSort($arr)
 9 {
10     if (count($arr) <= 0) {
11         return;
12     }
13     // 取出数组长度作为一个固定值
14     $len = count($arr);
15     // 外层控制比较的轮数
16     for ($i = 0;$i < $len; $i++) {
17         // 先假设每轮的第一个数就是最小的    ,记录下下标
18         $k = $i;
19 
20         // 内层控制每轮比较的次数
21         // 从当前元素的下一个元素开始取出,和当前元素进行比较
22         for ($j = $i+1; $j < $len; $j++) {
23             // 当前元素为$arr[$k],默认是最小的
24             if ($arr[$k] > $arr[$j]) {
25                 $k = $j;
26             }
27         }
28 
29         // 一趟循环结束,将最小值的下标和先前默认取得的最小值的下标进行比较,并交换最小值放到数组第一个位置
30         if ($k != $i) {
31             $temp = $arr[$k];
32             $arr[$k] = $arr[$i];
33             $arr[$i] = $temp;
34         }
35     }
36 
37     return $arr;
38 }
 1 /**
 2  * 插入排序的原理:
 3  *
 4  * 在要排序的数组中,假设前面已经排好了,现在要把第n个插入到前面的有序数中,
 5  * 使得这n个数也是排好序的,如此反复,直到全部排好。
 6  */
 7 function insertSort($arr)
 8 {
 9     if (count($arr) <= 0) {
10         return;
11     }
12 
13     $len = count($arr);
14 
15     // 外层循环控制比较的轮数
16     for ($i = 1; $i < $len; $i++) {
17         // 每一轮需要比较插入的元素
18         $temp = $arr[$i];
19 
20         // 遍历目标元素前面的每一个元素,依次进行比较
21         for ($j = $i - 1; $j >= 0; $j--) {
22             if ($temp < $arr[$j]) {
23                 // 遇到比目标元素的大的,那么将目标元素插入到前面比它大的元素之前
24                 // 大的元素向后移动一个位置
25                 $arr[$j+1] = $arr[$j];
26 
27                 $arr[$j] = $temp;
28 
29             } else {
30                 // 如果碰到不要移动的元素,则不再比较
31                 break;
32             }
33         }
34     }
35 
36     return $arr;
37 }
 1 /**
 2  * 快速排序的原理:
 3  *
 4  * 选择一个基准元素,通常选择第一个或者最后一个,然后将数组中的每一个元素和基准元素进行比较,
 5  * 然后将所有元素分成两批待排序的元素,一批比基准元素大的,一批比基准元素小的,然后对两批元素
 6  * 再使用同样的方法进行排序    
 7  */
 8 function quickSort($arr)
 9 {
10     if (count($arr) <= 0) {
11         return;
12     }
13 
14     // 数组长度
15     $len = count($arr);
16 
17     // 选择第一个元素作为基准元素
18     $base = $arr[0];
19     // 小于基元素的一批
20     $left_arr = [];
21     // 大于基元素的一批
22     $right_arr = [];
23 
24     for ($i = 1; $i < $len; $i++) {
25         if ($arr[$i] < $base) {
26             $left_arr[] = $arr[$i];
27         } else {
28             $right_arr[] = $arr[$i];
29         }
30     }
31 
32     // 对两个数组再进行递归排序
33     quickSort($left_arr);
34     quickSort($right_arr);
35 
36     // 合并数组并返回
37     return array_merge($left_arr, array($base), $right_arr);
38 }
原文地址:https://www.cnblogs.com/0519xf/p/7515072.html