美文网首页
完整快排

完整快排

作者: X1_blog | 来源:发表于2020-05-07 18:51 被阅读0次
/*完整的快速排序
1. 低于5个元素的排序使用插入排序
2. 使用middle_tree算法选择合适的pivot
*/
const cutOff = 5 ;
$arr = [14,18,19,37,23,40,29,30,11,7,2,1,8,6,3,5,4,5,4] ;
$sorted_arr = quickSort($arr);
myPrint($sorted_arr);       
// 1 2 3 4 4 5 5 6 7 8 11 14 18 19 23 29 30 37 40 [Finished in 0.1s]


function quickSort($arr)
{
    $count = count($arr);
    if($count<=1)return $arr;
    if($count<= cutOff ){
        $arr = insertSort($arr);
        return $arr;
    }
    $arr = middle_tree_pivot($arr);  

    $pivot = $arr[$count-1];
    $i = 0 ; $j = $count-1;

    while ($i<$j && $j<$count) {
        if($arr[$i]>$pivot){
            while ( $j >$i ) {
                $j--;
                if($arr[$j]<$pivot){
                    swap($arr,$i,$j);
                    break;
                }
            }
        }
        if($i==$j) break;
        $i ++;
    }
    swap($arr,$i,$count-1);

    $leftArr=  [];
    $rightArr= [];
    if($i==0){
        $rightArr = array_slice($arr, $i+1);
    }else if($i==$count-1){
        $leftArr = array_slice($arr, 0, $i );
    }else{
        $leftArr = array_slice($arr, 0, $i );
        $rightArr = array_slice($arr, $i+1);
    }
    return array_merge(quickSort($leftArr) , [ $pivot ] ,  quickSort($rightArr));
}


/*低于阈值使用插入排序*/
function insertSort($arr){
    for($j=1;$j<count($arr);$j++){
        $tmp  = $arr[$j];
        $i = $j;
        while ( ($i-1)>=0 && $arr[$i-1]>$tmp) {     // 注意: 先比较索引-1的值是否逆序, 是才对索引减1赋值
            $arr[$i] = $arr[$i-1];
            $i -- ;
        }
        $arr[$i] = $tmp;
    }
    return $arr ;
}

/*找到中位数并移动到最右*/
function middle_tree_pivot($arr){
    $count = count($arr);
    if($count%2==0) $index = $count/2;
    else  $index = ceil( $count/2);
    $index-=1;

    swap($arr,$index,$count-1);
    return $arr;
}

/*自定义格式数组输出*/
function myPrint($arr){
    foreach ($arr as  $value) {
        echo $value." " ;
    }
    echo "\n";
}

/*交换数组中索引的两个元素*/
function swap(&$arr,$index1,$index2)
{
    $tmp = $arr[$index1];
    $arr[$index1] = $arr[$index2];
    $arr[$index2] = $tmp;
}

相关文章

  • 完整快排

  • 快排

    快排代码

  • 快排

  • 快排

    昨天晚上睡觉前兴起准备十分钟写出快排,结果纠结了两个小时愣是没有搞出来,很郁闷地睡觉去。今天地铁上跟LG又重新缕了...

  • 快排

    基本思想: 先从数列中取出一个数作为基准数。 分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的...

  • 快排

  • 快排

    python实现 java实现:

  • 快排

    快速排序: 基本思想:1、先从数列中取出一个数作为基数。2、分区,将比此基数大的数放到它右边,小的数放到它左边。3...

  • 快排

    package sort;import java.util.Arrays;public class Quickso...

  • 快排

网友评论

      本文标题:完整快排

      本文链接:https://www.haomeiwen.com/subject/sxftghtx.html