/**
* 插入排序(Insertion Sort)的基本思想是:
* 每次将一个待排序的记录,按其关键字大小插入到前面已经排好序的子文件中的适当位置,直到全部记录插入完成为止。
* 插入排序:就是把第一个数当成已排序还的序列,然后把后面的数一个一个插入到前面适当的位置
*/
function insert_sort($arr){
//计算数组元素个数
$total_count = count($arr);
if($total_count <= 0) return 0;
//从这里开始循环 从1开始,表示把序列的第一个元素当成有序序列
for ($i = 1; $i < $total_count; $i++) {
$current = $arr[$i];
$j = $i - 1 ;
//$current 在while循环里面,值一直没有变化,只是位置有变化
while ($current < $arr[$j]) {
$arr[$j+1] = $arr[$j] ;
$arr[$j] = $current;
$j--;
if($j < 0) break;
}
}
return $arr;
}
/**
* 选择排序(Selection Sort)的基本思想是:
* 每一趟从待排序的记录中选出关键字最小的记录,顺序放在已排好序的子文件的最后,直到全部记录排序完毕。
* 选择排序:每次都选出最小的一个放在最前面,最开始的时候把第一个当做最小的
*/
function select_sort($arr){
$total_count = count($arr);
if($total_count <= 0) return 0;
for ($i=0; $i < $total_count; $i++) {
//拿第一个后面的每一个与第一比,每次比完都是把小的放在第一个的位置 ,比完内层的这个for循环,就选出了最小的一个
for ($j = $i + 1 ; $j < $total_count; $j++) {
$f = $i;
if($arr[$f] > $arr[$j]){
$f = $j;
}
if($f != $i){ //如果不等于,表示上一个if 发生了
$temp = $arr[$i];
$arr[$i] = $arr[$f];
$arr[$f] = $temp;
}
}
}
return $arr;
}
/**
* 冒泡排序的基本思想是:
* 两两比较待排序记录的关键字,发现两个记录的次序相反时即进行交换,直到没有反序的记录为止
*/
function bubble_sort($arr){
$total_count = count($arr);
for ($i=0; $i < $total_count; $i++) {
for ($j=$i+1; $j < $total_count; $j++) {
if($arr[$i] > $arr[$j]){
$tmp = $arr[$i];
$arr[$i] = $arr[$j];
$arr[$j] = $tmp;
}
}
}
return $arr;
}
/**
* 看看就会明白
*/
function quick_sort($arr){
$total_count = count($arr);
if($total_count <= 1) return $arr;
$middle = $arr[0];
$left_arr = $right_arr = array();
for ($i=1; $i < $total_count; $i++) {
if($arr[$i] > $middle){
$right_arr[] = $arr[$i];
}else{
$left_arr[] = $arr[$i];
}
}
$left_arr = quick_sort($left_arr);
$right_arr = quick_sort($right_arr);
return array_merge($left_arr , array($middle) , $right_arr);
}
参考:http://www.nowamagic.net/librarys/veda/detail/761