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 }