冒泡排序法:
基本思想是:通过对待排序序列从后向前(从下标较大的元素开始),依次比较相邻元素的排序码,若发现逆序则交换,使排序码较小的元素逐渐从后部移向前部(从下标较大的单元移向小标较小的单元),就像水底的气泡一样逐渐向上冒。
function bubbleSort(&$arr){
//这是一个中间变量;
$temp=0;
//把数组从小到大排列
//外层循环,代表排序回合,6个数5个回合
for($i=1;$i<=count($arr)-1;$i++){
//内层循环,遍历每个回合的元素,每个回合会将最大的数放在下标最大的位置,所以下个回合少比较一个元素
for($j=0;$j<count($arr)-$i;$j++){
if($arr[$j]>$arr[$j+1]){
//值对换
$temp=$arr[$j];
$arr[$j]=$arr[$j+1];
$arr[$j+1]=$temp;
}
}
}
}
$myarr=array(0,5,-1,54,-2.3,12);
//使用函数输出;
bubbleSort($myarr);//传地址,操作等同
print_r($myarr);
结果:Array ( [0] => -2.3 [1] => -1 [2] => 0 [3] => 5 [4] => 12 [5] => 54 )
【注意:数组默认传递的是值,而不是地址(对象默认传递的是地址!)!
class my{
var $a=5;
}
function aa($b){
$b->a=52;
}
$n=new my();
aa($n);
print $n->a;】
选择式排序法:
基本思想是:第一次从R[0]~R[n-1]中选取最小值,与R[0]交换,第二次从R[1]~R[n-1]中选取最小值,与R[1]交换,第三次从R[2]~R[n-1]中选取最小值,与R[2]交换,。。。。。。第i次从R[i-1]~R[n-1]中选取最小值,与R[n-2]交换,总共通过n-1次,得到一个按排序码从小到大排序的有序序列。
function selectSort(&$arr){
$temp=0;
for($i=0;$i<count($arr)-1;$i++){
//假设$arr[$i]就是最小的数;
$minVal=$arr[$i];
//记录认为的最小数的小标
$minIndex=$i;
for($j=$i+1;$j<count($arr);$j++){
//说明我们认为的最小值不是最小值
if($minVal>$arr[$j]){
$minVal=$arr[$j];
$minIndex=$j;
}
}
//最后交换
$temp=$arr[$i];
$arr[$i]=$arr[$minIndex];
$arr[$minIndex]=$temp;
}
}
$myarr=array(0,5,-1,45,-12);
//使用选择排序函数输出;
selectSort($myarr);
print_r($myarr);
结果:Array ( [0] => -12 [1] => -1 [2] => 0 [3] => 5 [4] => 45 )
插入排序法
基本思想:把n个待排序的元素看成一个有序表和无序表,开始时有序表中只包含一个元素,无序列表中包含一个元素,排序过程中每次从无序表中取出第一个元素,把它的排序码依次与有序表元素的排序码进行比较,将它插入到有序表中的适当位置,使之成为新的有序表。
function insertSort(&$arr){
//先默认下标是0的这个数是有序的,所以从1开始
for($i=1;$i<count($arr);$i++){
//$insertVal是准备插入的数
$insertVal=$arr[$i];
//准备先和下标是$insertIndex的元素比较
$insertIndex=$i-1;
//如果这个条件满足,说明还没有找到适当的位置
while($insertIndex>=0&&$insertVal<$arr[$insertIndex]){
//满足该条件时,把该数后移
$arr[$insertIndex+1]=$arr[$insertIndex];
//循环
$insertIndex--;
}
//这是已经找到适当的位置,则插入(这里可以继续优化!)
$arr[$insertIndex+1]=$insertVal;
}
}
$myarr=array(0,5,-1,45,-12);
//使用插入法排序
insertSort($myarr);
print_r($myarr);
结果:Array ( [0] => -12 [1] => -1 [2] => 0 [3] => 5 [4] => 45 )
快速排序法
特点:当数据量很大时,可以快速的排列,得出结果;是这几种排序法中速度最快的一种方法;
缺点:占用内存大;
function quickSort($left,$right,&$array){
$l=$left;
$r=$right;
$pivot=$array[($left+$right)/2];
$temp=0;
while($l<$r){
while($array[$l]<$pivot) $l++;
while($array[$r]>$pivot) $r--;
if($l>=$r) break;
$temp=$array[$l];
$array[$l]=$array[$r];
$array[$r]=$temp;
if($array[$l]==$pivot) --$r;
if($array[$r]==$pivot) ++$l;
}
if($l==$r){
$l++;
$r--;
}
if($left<$r) quickSort($left,$r,$array);
if($right>$l) quickSort($l,$right,$array);
}
//快速排序法
$array=array(-9,78,0,23,-567,89);
quickSort(0,count($array)-1,$array);
print_r($array);
结果:Array ( [0] => -567 [1] => -9 [2] => 0 [3] => 23 [4] => 78 [5] => 89 )