快速排序

思想:
通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
示例:

 1) {
        $temp = $arr[0];
        $x = $y = array();
        for($i = 1; $i < count($arr); $i++) {
            if($arr[$i] < $temp) {
                $x[] = $arr[$i];
            } else {
                $y[] = $arr[$i];
            }
        }
        $x = quick_sort($x);
        $y = quick_sort($y);
        return array_merge($x, array($temp),  $y);
    } else {
        return $arr;
    }
}
$arr = array(1,4,5,89,22,44,5,33,6,7,82,332);
$result = quick_sort($arr);
print_r($result);

最坏的情况下就是O(n2)

插入排序

原理:
1. 从第一个元素开始,该元素可以认为已经被排序
2. 取出下一个元素,在已经排序的元素序列中从后向前扫描
3. 如果该元素(已排序)大于新元素,将该元素移到下一位置
4. 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置
5. 将新元素插入到下一位置中
6. 重复步骤2~5

php
//从小到大排序
function insert_sort($arr){
    for($i = 1; $i < count($arr); $i++){
        $tmp=$arr[$i];
        $key=$i-1;
        while($key>=0 && $tmp < $arr[$key]){
            $arr[$key+1]=$arr[$key];
            $key--;
        }
        if($key+1 != $i)
            $arr[$key+1]=$tmp;
        }
        return $arr;
}
$arr = array(1,4,5,89,22,44,5,33,6,7,82,332);
$result = insert_sort($arr);
print_r($result);

 

选择排序

分类:

选择排序(选择排序,堆排序,平滑排序,笛卡尔树排序,锦标赛排序,圈排序)

思想:

1、从左至右遍历,找到最小(大)的元素,然后与第一个元素交换。

2、从剩余未排序元素中继续寻找最小(大)元素,然后与第二个元素进行交换。

3、以此类推,直到所有元素均排序完毕。

示例:

 

php 
function select_sort($array){
    $count=count($array);
    for($i=0;$i<$count-1;$i++){
        $min=$i;
        for($j=$i+1;$j<$count;$j++){
            if($array[$min]>$array[$j]){
                $min=$j;
            }
        }
        if($min!=$i){
            $temp=$array[$min];
            $array[$min]=$array[$i];
            $array[$i]=$temp;
        }
    }
    return $array;
}
$arr = array(1,4,5,89,22,44,5,33,6,7,82,332);
$result = select_sort($arr);
print_r($result);

 

桶排序

桶排序 (Bucket sort)或所谓的箱排序,是一个排序算法,工作的原理是将数组分到有限数量的桶子里。每个桶子再个别排序(有可能再使用别的排序算法或是以递归方式继续使用桶排序进行排序)
思想:
设待排序序列的元素取值范围为0到m,则我们新建一个大小为m+1的临时数组并把初始值都设为0,遍历待排序序列,把待排序序列中元素的值作为临时数组的下标,找出临时数组中对应该下标的元素使之+1;然后遍历临时数组,把临时数组中元素大于0的下标作为值按次序依次填入待排序数组,元素的值作为重复填入该下标的次数,遍历完成则排序结束序列有序。
示例:

 $v){
    for($i = 0; $i < $v; $i++) {
        echo $k;
    }
}

 
应用大量数据排序
比如9亿不重复的9位数字排序,可以初始化10亿个bit来标示存在这个数字是否存在,如果该位是1就输出该位整数