1. 冒泡排序
思路分析:在要排序的一组数中,对当前还未拍好的序列,从前往后对相邻的两个数一次进行比较和调整,让较大的数往下沉,较小的数往上冒。也就是每俩个当相邻的数比较厚发现他们的排序与排序要求相反时,就将他们互换
代码实现:
<?php
function bubbleSort($arr) {
$len = count($arr);
for($i = 0; $i < $len-1; $i++) {
for ($j = 0; $j < $len-$i-1; $j++) {
if ($arr[$j] > $arr[$j+1]) {
$tmp = $arr[$j+1];
$arr[$j+1] = $arr[$j];
$arr[$j] = $tmp;
}
}
}
return $arr;
}
$arr = array(5,3,4,2,1,6,3);
$res = bubbleSort($arr);
2. 插入排序
思路分析 :在要排序的一组数中,假设前面的数已经是排好顺序的,现在要把第n个数插入到前面有序数列中,让这个n个数也是排好顺序的。反复循环,直到完全排好序
<?php
function insertSort($arr) {
$len = count($arr);
for ($i = 1; $i < $len; $i++) {
$tmp = $arr[$i];
for ($j = $i-1;$j >= 0; $j --) {
if ($tmp < $arr[$j]) {
//如果插入元素小,交换位置
$arr[$j+1] = $arr[$j];
$arr[$j] = $tmp;
} else {
//如果不需要移动,直接break,前面数组已经排好了,不需要再次比较前面的数值
break;
}
}
}
return $arr;
}
$arr = array(5,3,4,2,1,6,3);
$res = insertSort($arr);
3.选择排序
思路分析:再要排序的一组数中,选出最小的一个数与第一个位置的数交换,然后在剩下的数中在选个最小的与第二个位置的数交换,一直循环到倒数第二个数和最后一个数比较为止。
<?php
function selectSort() {
//外层控制轮询数,内层控制比较次数
$len = count($arr);
for ($i = 0; $i < $len-1; $i++) {
$p = $i;//假设当前最小值位置是$i
for ($j = $i+1;$j < $len; $j++) {
if ($arr[$p] > $arr[j]) {
//发现更小的,p记录最小值位置,下次比较时使用
$p = $j;
}
}
//已经确定最小值位置,保存到$p中,如果最小位置与当前假设位置$i不同,则位置互换
if ($p !$= $i) {
$tmp = $arr[$p];
$arr[$p] = $arr[$j];
$arr[$j] = $tmp;
}
}
return $arr;
}
$arr = array(5,3,4,2,1,6,3);
$res = selectSort($arr);
4.快速排序
思路分析:选择一个基准元素,通常选择第一个或者最后一个元素,通过一趟扫描,将待排序列分成两部分,一部分比基准元素小,一部分大于等于基准元素。此时基准元素再起排好序后的正确位置,然后在用同样的方法递归的排序划分的两部分。
代码实现:
<?php
function quickSort($arr) {
$len = count($arr);
if ($len <= 1) {
return $arr;
}
//选择第一个元素作为基准
$baseNum = $arr[0];
//遍历出标尺之外的所有元素,按照大小关系放入两个数组内
$leftArr = array();
$rightArr = array();
for ($i = 1;$i < $len; $i++) {
if ($baseNum > $arr[$i]) {
$leftArr[] = $arr[$i];
} else {
$rightArr[] = $arr[$i];
}
}
//在分别对左右数组进行相同处理方式递归调用,最后合并数组
$leftArr = quickSort($leftArr);
$rightArr = quickSort($rightArr);
return array_merge($leftArr, array($baseNum),$rightArr);
}
$arr = array(5,3,4,2,1,6,3);
$res = quickSort($arr);