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 }