美文网首页
排序算法的稳定性

排序算法的稳定性

作者: 小伟_be27 | 来源:发表于2019-05-02 13:15 被阅读0次

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

//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);
}

相关文章

  • 左神初级算法课程第三讲笔记-排序算法稳定性

    排序算法稳定性 排序算法稳定性:即相同的值排序后还是按照原有的次序 三个O(N): 冒泡算法:可以实现稳定性,大数...

  • 第7章 算法

    排序算法的稳定性 稳定性:稳定排序算法会让原本有相等键值的纪录维持相对次序。也就是如果一个排序算法是稳定的,当有两...

  • 算法基础之各种排序算法思想图解

    文章目录 排序算法比较排序算法稳定性选择排序冒泡排序插入排序希尔排序快速排序归并排序GitHub:https://...

  • 2020-04-30-排序算法

    冒泡排序 直接选择排序 插入排序 快速排序 参考 算法学习笔记17-经典排序算法八大排序算法稳定性分析

  • 排序和查找

    排序算法 排序的稳定性image.png 影响排序算法的几个因素 时间性能 辅助空间 算法复杂性 冒泡排序 时间复...

  • 数据结构01-常规排序算法

    第一章 常规排序算法 第一章 常规排序算法一、排序的基本概念排序内部排序与外部排序排序的稳定性二、冒泡排序算法思想...

  • 2.8 分析十种排序算法的稳定性

    Chapter2: 查找与排序 8. 分析十种排序算法的稳定性 1. 什么是算法的稳定性 稳定如果a=b, a原来...

  • 排序:(一)排序算法小常识

    1 算法稳定性 算法稳定性的意义 如果只是简单的进行数字的排序,那么稳定性将毫无意义。如果排序的内容仅仅是一个复杂...

  • Go:实现经典排序算法

    经典排序算法 排序算法在时间复杂度上分为三个档次:O(n),O(nlgn),O(n^2) 排序算法的稳定性。如果待...

  • 排序算法

    排序算法稳定性:如果Ai= Aj,排序前Ai在Aj之前,排序后Ai还在Aj之前,则称这种排序算法是稳定的。 好处:...

网友评论

      本文标题:排序算法的稳定性

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