效率比较:冒泡<选择<插入<快速
4:快速排序
/**
* 随便取一个数,每循环一次则把比他小的放到左边,比他大的放到右边,递归完成
* @param array $seq
* @return array
*/
function quicksort($seq) {
if (count($seq) > 1) {
$k = $seq[0];
$x = array();
$y = array();
$_size = count($seq); //do not use count($seq) in loop for.
for ($i=1; $i<$_size; $i++) {
if ($seq[$i] <= $k) {
$x[] = $seq[$i];
} else {
$y[] = $seq[$i];
}
}
$x = quicksort($x);
$y = quicksort($y);
return array_merge($x, array($k), $y);
} else {
return $seq;
}
}
3:插入排序
$arr = array(3,2,1);
//把数组的前半部分看做是有序的,后面的不断的往前面插入
function insert_sort(&$arr)
{
//先默认下标为0 这个数已经是有序
for($i=1;$i<count($arr);$i++)
{
//$insertValue 是准备插入的数
$insertValue = $arr[$i];
//先准备和$insertIndex比较
$inserIndex = $i-1;
//如果满足这个条件,说明我们没有找到合适的位置、
while($inserIndex>=0 && $insertValue<$arr[$inserIndex])
{
//同时把数相应往后面移动
$arr[$inserIndex+1] = $arr[$inserIndex];
$inserIndex--;
}
//插入(这时就给$insertValue找到适当的位置)
$arr[$inserIndex+1] = $insertValue;//之所以+1 是因为 $inserIndex 是插入的前一个数,即每次和他比较的那个数
}
}
insert_sort($arr);
print_r($arr);
//把数组的前半部分看做是有序的,后面的不断的往前面插入
function insert_sort(&$arr)
{
//先默认下标为0 这个数已经是有序
for($i=1;$i<count($arr);$i++)
{
//$insertValue 是准备插入的数
$insertValue = $arr[$i];
//先准备和$insertIndex比较
$inserIndex = $i-1;
//如果满足这个条件,说明我们没有找到合适的位置、
while($inserIndex>=0 && $insertValue<$arr[$inserIndex])
{
//同时把数相应往后面移动
$arr[$inserIndex+1] = $arr[$inserIndex];
$inserIndex--;
}
//插入(这时就给$insertValue找到适当的位置)
$arr[$inserIndex+1] = $insertValue;//之所以+1 是因为 $inserIndex 是插入的前一个数,即每次和他比较的那个数
}
}
insert_sort($arr);
print_r($arr);
2:选择排序
$arr = array(1,2,3);
/**
* 取一个数依次和后面的做比较,记录本次的最小值,然后交换位置
*
*/
function select_sort(&$arr)
{
$nums = count($arr)-1;//外层循环次数
$temp = 0;//交换变量用的临时变量
for($i=0;$i<$nums;$i++)
{
$minValue = $arr[$i];//假设$i就是最小数
$minIndex = $i; //记录我认为的最小数的下标
//每排好一个,以后就可以少循环一回
for($j=$i+1;$j<$nums;$j++)
{
if($minValue>$arr[$j])
{
$minIndex = $j;
$minValue = $arr[$j];
}
}
//交换位置
$temp = $arr[$i];
$arr[$i] = $arr[$minIndex];
$arr[$minIndex] = $temp;
}
}
select_sort($arr);
/**
* 取一个数依次和后面的做比较,记录本次的最小值,然后交换位置
*
*/
function select_sort(&$arr)
{
$nums = count($arr)-1;//外层循环次数
$temp = 0;//交换变量用的临时变量
for($i=0;$i<$nums;$i++)
{
$minValue = $arr[$i];//假设$i就是最小数
$minIndex = $i; //记录我认为的最小数的下标
//每排好一个,以后就可以少循环一回
for($j=$i+1;$j<$nums;$j++)
{
if($minValue>$arr[$j])
{
$minIndex = $j;
$minValue = $arr[$j];
}
}
//交换位置
$temp = $arr[$i];
$arr[$i] = $arr[$minIndex];
$arr[$minIndex] = $temp;
}
}
select_sort($arr);
print_r($arr);
1.冒泡排序
$arr = array(3,2,1);
function bubble_sort(&$arr)
{
$flag = false;
$nums = count($arr)-1;//外层循环次数$temp = 0;//变量交换位置
for($i=0;$i<$nums;$i++)
{
//每排好一个,以后就可以少循环一回
for($j=0;$j<$nums-$i;$j++)
{
if($arr[$j]>$arr[$j+1])
{
//交换位置
$temp = $arr[$j];
$arr[$j] = $arr[$j+1];
$arr[$j+1] = $temp;
$flag = true;//以次来判断是否进入过次层,如果没有进入过,说明本来就是个有序的,无需进行排序了
}
}
if(!$flag){
//已经排好了
break;
}else{
$flag = false;
}
}
}
bubble_sort($arr);
print_r($arr);
//外层每循环一次则找出一个最大值,放到后面,所以里层的循环就可以减少一次
function bubble_sort(&$arr)
{
$flag = false;
$nums = count($arr)-1;//外层循环次数$temp = 0;//变量交换位置
for($i=0;$i<$nums;$i++)
{
//每排好一个,以后就可以少循环一回
for($j=0;$j<$nums-$i;$j++)
{
if($arr[$j]>$arr[$j+1])
{
//交换位置
$temp = $arr[$j];
$arr[$j] = $arr[$j+1];
$arr[$j+1] = $temp;
$flag = true;//以次来判断是否进入过次层,如果没有进入过,说明本来就是个有序的,无需进行排序了
}
}
if(!$flag){
//已经排好了
break;
}else{
$flag = false;
}
}
}
bubble_sort($arr);
print_r($arr);