一、冒泡排序
1、介绍:
冒泡排序是一种简单的排序算法,它也是一种稳定排序算法。其实现原理是重复扫描待排序序列,并比较每一对相邻的元素,当该对元素顺序不正确时进行交换。一直重复这个过程,直到没有任何两个相邻元素可以交换,就表明完成了排序。
2、具体步骤:
a、比较相邻的元素。如果第一个比第二个大,就交换他们两个。
b、对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
c、针对所有的元素重复以上的步骤,除了最后一个。
d、持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
3、代码:
/**
* 冒泡排序
* @param $arr
* @return mixed
*/
function arrayBubblingSort($arr) {
$count = count($arr);
//外层控制排序轮次
for ($i = 0; $i < $count - 1; $i ++) {
//内层控制每轮比较次数
for ($j = 0; $j < $count - 1 - $i; $j ++) {
if ($arr[$j] > $arr[$j + 1]) {
$temp = $arr[$j];
$arr[$j] = $arr[$j + 1];
$arr[$j + 1] = $temp;
}
}
}
return $arr;
}
二、归并排序
1、介绍:
归并排序是建立在归并操作上的一种有效,稳定的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。
2、具体步骤:
a、申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列
b、设定两个指针,最初位置分别为两个已经排序序列的起始位置
c、比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置
重复步骤c直到某一指针超出序列尾
将另一序列剩下的所有元素直接复制到合并序列尾
3、代码
/**
* 归并排序
* @param array $array
* @return array
*/
function allMergeSort($array = []) {
$count = count($array);
//递归结束条件,到达这步的时候,数组就只剩下一个元素了,也就是分离了数组
if ($count <= 1) {
return $array;
}
$mid = intval($count / 2);
//拆分数组0-mid这部分给左边left_array
$left_array = array_slice($array, 0, $mid);
//拆分数组mid-末尾这部分给右边right_array
$right_array = array_slice($array, $mid);
//左边拆分完后开始递归合并往上走
$left_array = allMergeSort($left_array);
//右边拆分完毕开始递归往上走
$right_array = allMergeSort($right_array);
//合并两个数组,继续递归
$return_array = mergeSort($left_array, $right_array);
return $return_array;
}
/**
* @param $left_array
* @param $right_array
* @return array
*/
function mergeSort($left_array, $right_array) {
$return_array = [];
while (count($left_array) && count($right_array)) {
$return_array[] = $left_array[0] < $right_array[0] ? array_shift($left_array) : array_shift($right_array);
}
return array_merge($return_array, $left_array, $right_array);
}
三、快速排序
1、介绍:
设要排序的数组是A[0]……A[N-1],⾸先任意选取⼀个数据(通常选⽤数组的第⼀个数)作为关键数据,然后将所有⽐它⼩的数都放到它左边,所有⽐它⼤的数都放到它右边,这个过程称为⼀趟快速排序。值得注意的是,快速排序不是⼀种稳定的排序算法,也就是说,多个相同的值的相对位置也许会在算法结束时产⽣变动
2、具体步骤:
a、在数组中选⼀个基准数(通常为数组第⼀个);
b、将数组中⼩于基准数的数据移到基准数左边,⼤于基准数的移到右边;
c、对于基准数左、右两边的数组,不断重复以上两个过程,直到每个⼦集只有⼀个元素,即为全部有序。
3、代码
/**
* 数组快速排序
* @param $array
* @return bool|array
*/
function arrayQuickSort($array) {
if (!is_array($array))
return false;
if (count($array) > 1) {
$left = $right = [];
for ($i = 1; $i < count($array); $i ++) {
if ($array[$i] <= $array[0]) {
$left[] = $array[$i];
} else {
$right[] = $array[$i];
}
}
$left = arrayQuickSort($left);
$right = arrayQuickSort($right);
return array_merge($left, [$array[0]], $right);
} else {
return $array;
}
}