排序算法
冒泡排序 选择排序 插入排序 (效率低只有教学价值)
合并排序 快速排序(可以用在生产环境中)
/*
* 冒泡排序
*
冒泡排序(Bubble Sort)是最易懂的排序算法,但是效率较低,生产环境中很少使用。
依次比较相邻的两个数,如果不符合排序规则,则调换两个数的位置。这样一遍比较下来,能够保证最大(或最小)的数排在最后一位。
再对最后一位以外的数组,重复前面的过程,直至全部排序完成。
* */
function bubbleSort($arr){
if(count($arr) < 2) return $arr;
$_size = count($arr);
for($i=0;$i<$_size;$i++){
for($j=0;$j<($_size-$i-1);$j++){
//交换顺序
if($arr[$j] > $arr[$j+1]){
$tmp = $arr[$j];
$arr[$j] = $arr[$j+1];
$arr[$j+1] = $tmp;
}
}
}
return $arr;
}
/*
*
* 选择排序
* 选择排序(Selection Sort)与冒泡排序类似,也是依次对相邻的数进行两两比较。
* 不同之处在于,它不是每比较一次就调换位置,而是一轮比较完毕,找到最大值(或最小值)之后,将其放在正确的位置,其他数的位置不变。
*
* */
function selectionSort($arr){
if(count($arr) < 2) return $arr;
$_size = count($arr);
for($i=0;$i<$_size;$i++){
$min = $i;
for($j=$i+1;$j<$_size;$j++){
//交换顺序
if($arr[$j] < $arr[$min]){
$min = $j;
}
}
//如果当前位置不是最小值交换位置
if($i!=$min){
$tmp = $arr[$min];
$arr[$min] = $arr[$i];
$arr[$i] = $tmp;
}
}
return $arr;
}
/*
* 插入排序
* 插入排序(insertion sort)比前面两种排序方法都更有效率。它将数组分成“已排序”和“未排序”两部分,
* 一开始的时候,“已排序”的部分只有一个元素,然后将它后面一个元素从“未排序”部分插入“已排序”部分,
* “已排序”的部分比较排序
* 从而“已排序”部分增加一个元素,
* “未排序”部分减少一个元素。以此类推,完成全部排序。
* */
function insertSort($arr){
$_size = count($arr);
for($i=1;$i<$_size;$i++){
// 储存当前位置的值
$tmp=$arr[$i];
$key=$i-1;
/*
* 当已排序部分的当前元素大于value,
* 就将当前元素向后移一位,再将前一位与value比较
*/
while($key>=0&&$tmp<$arr[$key]){
$arr[$key+1]=$arr[$key];
$key--;
}
//交换位置$key+1 $i的比较
if(($key+1)!=$i){
$arr[$key+1]=$tmp;
}
}
return$arr;
}
/*
1.先从数列中取出一个数作为基准数。
2.分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。
3.再对左右区间重复第二步,直到各区间只有一个数。
* 快速排序 非稳定排序,效率高广泛使用
* */
function quickSort(&$arr){
if(count($arr)>1){
$k=$arr[0];
$x=array();
$y=array();
$_size=count($arr);
for($i=1;$i<$_size;$i++){
if($arr[$i]<=$k){
$x[]=$arr[$i];
}elseif($arr[$i]>$k){
$y[]=$arr[$i];
}
}
$x=quickSort($x);
$y=quickSort($y);
return array_merge($x,array($k),$y);
}else{
return$arr;
}
}
/*
*
* 冒泡 选择 插入排序 只有教学价值,因为效率低,很少实际使用。合并排序(Merge sort)则是一种被广泛使用的排序方法。
它的基本思想是,将两个已经排序的数组合并,要比从头开始排序所有元素来得快。
因此,可以将数组拆开,分成n个只有一个元素的数组,然后不断地两两合并,直到全部排序完成。
*
* 合并排序
*
* */
$a=array(3,1,2,4,10,6,8,7,11,21);
//合并2个已经排好序的数组
function merge($a,$b){
$i = 0; $j = 0;
$n = count($a);
$m = count($b);
$data = array();
while($i<$n && $j<$m){
if($a[$i] < $b[$j]){
$data[] = $a[$i++];
}else{
$data[] = $b[$j++];
}
}
while($i<$n){
$data[]=$a[$i++];
}
while($j<$m){
$data[]=$b[$j++];
}
return $data;
}
function mergeSort($myArray){
$params = array();
$len = count($myArray);
if($len < 2){
return $myArray;
}
$middle = floor($len/2);
$left = array_slice($myArray,0,$middle);
$right = array_slice($myArray,$middle);
$params = merge(mergeSort($left),mergeSort($right));
//删除0-len的数组并替换成排序好的数组
array_splice($myArray,0,$len,$params);
// 返回排序后的数组
return $myArray;
}