排序算法的稳定性

比如说学校统计学生成绩,学生是按学生名字拼音的字典顺序来进行排序,
现在的话统计按学生分数来进行排序,排序前后,若学生拼音的字典顺序没有改变,则这个排序是稳定的,反之,并不稳定。

//c++写法
bool operator<(const Student& otherStudent){
retutn score !=otherStudent.score ?
            score > otherStudent.score : 
            name < otherStudent.name

稳定的排序算法

插入排序

//php写法
function insertSort(&$arr){
    for($i = 1; $i<count($arr); $i++){
        $temp = $arr[$i];
        for($j = $i-1; $j >=0; $j--){
            if($temp < $arr[$j]){
                $arr[$j+1] = $arr[$j];
                $arr[$j] = $temp;
            }
        }
    }
} 

归并排序

//php写法
function MergeSort(array &$arr){
    $start = 0;
    $end = count($arr) - 1;
    MSort($arr,$start,$end);
}

function MSort(array &$arr,$start,$end){ 
    if($start < $end){
        $mid = floor(($start + $end) /2);
        MSort($arr,$start,$mid);
        MSort($arr,$mid+1,$end);
        Merge($arr,$start,$mid,$end);
    }
    
}
//归并操作
function Merge(array &$arr,$start,$mid,$end){
    $i = $start;
    $j=$mid + 1;
    $k = $start;
    $temparr = array();

    while($i!=$mid+1 && $j!=$end+1)
    {
       if($arr[$i] >= $arr[$j]){
           $temparr[$k++] = $arr[$j++];
       }
       else{
           $temparr[$k++] = $arr[$i++];
       }
    }

    //将第一个子序列的剩余部分添加到已经排好序的 $temparr 数组中
    while($i != $mid+1){
        $temparr[$k++] = $arr[$i++];
    }
    //将第二个子序列的剩余部分添加到已经排好序的 $temparr 数组中
    while($j != $end+1){
        $temparr[$k++] = $arr[$j++];
    }
    for($i=$start; $i<=$end; $i++){
        $arr[$i] = $temparr[$i];
    }
}

不稳定的排序算法

快速排序
例如待排序数组
$a = [1,2,2,3,4,5,6];
若选择第一2,(2[1])为比较的元素,把<= 2[1]的放在左边,那么第二个2和第一个2顺序和原数组顺序不对了
若选择第二个2,(2[2])为比较的元素,把>=2[2]的放在右边,那么第一个2,和第二个2顺序和原数组顺眼不对了,所以是不稳定的。

//php写法
function kuaisort($arr){
    if(count($arr)<=1){
        return $arr;
    }
    $key = $arr[0];
    $left = array();
    $right = array();
    for($i = 1; $i <count($arr); $i++){
        if($key >= $arr[$i]){
            array_push($left,$arr[$i]);
        }else{
            array_push($right,$arr[$i]);
        }
    }
    $left = kuaisort($left);
    $right = kuaisort($right);
    return array_merge($left,array($key),$right);
}
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 在讲解二数下的“有余数的除法”时,为了说明余数<除数,我出了一道算数题——61÷( )=( )......7。看上...
    阿瞳正传阅读 2,425评论 0 0
  • 2019年消防工程师前景如何?消防证书是否还有升值空间? 消防工程师自15年开考以来,较高的挂靠费就已经是人尽皆知...
    冠和教育王老师阅读 1,175评论 0 0
  • “做人呢,”泡面小食堂说,“最重要的是要开心。” 不过,怎么才开心呢? “美丽四川,相约阆中。”宣传语说,“我在阆...
    鲁长安阅读 1,247评论 0 0
  • 回忆是一记毒药, 伏延在情感的脉络, 它咬噬住心脏, 却也会开出灿烂星光。
    陌上花开小左伊阅读 1,409评论 1 0

友情链接更多精彩内容