PHP中的几种常用排序算法及思想
1,冒泡排序
冒泡排序思想:以升序为例,从第一个元素开始,对数组中两两相邻的元素进行比较,将较小的元素放在前边,较大的元素放在后边。一轮比较结束之后,一个最大的数沉底,成为数组中的最后一个元素。n个元素,经过n-1轮的比较之后完成排序。
/**
*@param array $arr
*@return array $arr
*/
function BubbleSort($arr) {
$len = count($arr);//获取数组长度
for ($i = 1; $i < $len; $i++) {
for ($j = $len - 1; $j >= $i ; $j--) {
if ($arr[$j] < $arr[$j-1]) {//相邻两个元素进行比较
$iTemp = $arr[$j-1];
$arr[$j-1] = $arr[$j];
$arr[$j] = $iTemp;
}
}
}
return $arr;
}
2,交换排序
交换排序思想:就是根据数组中两个值的比较结果来对换这两个值在序列中的位置,交换排序的特点是:将值较大的向数组的尾部移动,较小的值向数组的前部移动。
/**
*@param array $arr
*@return array $arr
*/
function ExchangeSort($arr){
$len = count($arr);//获取数组长度
for ($i = 0;$i < $len - 1; $i++) {
for ($j = $i + 1; $j < $len; $j++) {
if ($arr[$j] < $arr[$i]) {
$iTemp = $arr[$i];
$arr[$i] = $arr[$j];
$arr[$j] = $iTemp;
}
}
}
return $arr;
}
3,选择排序
选择排序思想:它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。 选择排序是不稳定的排序方法(比如序列[5, 5, 3]第一次就将第一个[5]与[3]交换,导致第一个5挪动到第二个5后面)。
/**
*@param array $arr
*@return array $arr
*/
function SelectSort($arr) {
$len = count($arr);//获取数组长度
for ($i = 0;$i < $len-1; $i++) {
$iTemp = $arr[$i];
$iPosition = $i;
for ($j = $i + 1;$j < $len; $j++){
if ($arr[$j] < $iTemp) {
$iTemp = $arr[$j];
$iPosition = $j;
}
}
$arr[$iPosition] = $arr[$i];
$arr[$i] = $iTemp;
}
return $arr;
}
4,插入排序
插入排序思想:将一组数据分成两组,我分别将其称为有序组与待插入组。每次从待插入组中取出一个元素,与有序组的元素进行比较,并找到合适的位置,将该元素插到有序组当中。就这样,每次插入一个元素,有序组增加,待插入组减少。直到待插入组元素个数为0。
/**
*@param array $arr
*@return array $arr
*/
function InsertSort($arr){
$len = count($arr);
for ($i = 1;$i < $len; $i++) {
$iTemp = $arr[$i];
$iPos = $i - 1;
while (($iPos >= 0) && ($iTemp < $arr[$iPos])) {
$arr[$iPos + 1] = $arr[$iPos];
$iPos--;
}
$arr[$iPos+1] = $iTemp;
}
return $arr;
}
5,快速排序
快速排序思想:
1.先从数列中取出一个数作为基准数,记为x。
2.分区过程,将不小于x的数全放到它的右边,不大于x的数全放到它的左边。(这样key的位置左边的没有大于key的,右边的没有小于key的,只需对左右区间排序即可)
3.再对左右区间重复第二步,直到各区间只有一个数
/**
*@param array $arr
*@return array $new_arr
*/
function QuickSort($arr){
$num = count($arr);
$l = $r = 0;
$left = $right = array();
for ($i = 1;$i < $num; $i++) {
if ($arr[$i] < $arr[0]) {
$left[] = $arr[$i];
$l++;
} else {
$right[] = $arr[$i];
$r++; //
}
}
if($l > 1) {
$left = QuickSort($left);
}
$new_arr = $left;
$new_arr[] = $arr[0];
if ($r > 1) {
$right = QuickSort($right);
}
for($i = 0;$i < $r; $i++) {
$new_arr[] = $right[$i];
}
return $new_arr;
}
这几种排序算法的思想都很简单,拿出纸笔写几个数据,自己画画就明白了