排序算法稳定性

所谓稳定性是指待排序的序列中有两元素相等,排序之后它们的先后顺序不变.假如为A1,A2.它们的索引分别为1,2.则排序之后A1,A2的索引仍然是1和2.

稳定性的定义

假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,ri=rj,且ri在rj之前,而在排序后的序列中,ri仍在rj之前,则称这种排序算法是稳定的;否则称为不稳定的。

判断方法

对于不稳定的排序算法,只要举出一个实例,即可说明它的不稳定性;而对于稳定的排序算法,必须对算法进行分析从而得到稳定的特性。需要注意的是,排序算法是否为稳定的是由具体算法决定的,不稳定的算法在某种条件下可以变为稳定的算法,而稳定的算法在某种条件下也可以变为不稳定的算法。例如,对于如下冒泡排序算法,原本是稳定的排序算法,如果将记录交换的条件改成a[j].key>=a[j+1].key,则两个相等的记录就会交换位置。
void BubbleSort(DataType a[], int n)
  { int i, j, flag = 1;
DataType temp;
for(i = 1; i < n && flag == 1; i++)
{ flag = 0;
for(j = 0; j < n-i; j++)
{ if(a[j].key >a[j+1].key){               /*如果改为a[j].key >=a[j+1].key,就不稳定咯*/
                       flag = 1;
temp = a[j];
a[j] = a[j+1];
a[j+1] = temp; }
}
}
}   

常见算法的稳定性(要记住)

堆排序、快速排序、希尔排序、直接选择排序不是稳定的排序算法,而基数排序、冒泡排序、直接插入排序、折半插入排序、归并排序是稳定的排序算法。

稳定性的意义 1、如果只是简单的进行数字的排序,那么稳定性将毫无意义。
2、如果排序的内容仅仅是一个复杂对象的某一个数字属性,那么稳定性依旧将毫无意义(所谓的交换操作的开销已经算在算法的开销内了,如果嫌弃这种开销,不如换算法好了?)
3、如果要排序的内容是一个复杂对象的多个数字属性,但是其原本的初始顺序毫无意义,那么稳定性依旧将毫无意义。
4、除非要排序的内容是一个复杂对象的多个数字属性,且其原本的初始顺序存在意义,那么我们需要在二次排序的基础上保持原有排序的意义,才需要使用到稳定性的算法,例如要排序的内容是一组原本按照价格高低排序的对象,如今需要按照销量高低排序,使用稳定性算法,可以使得想同销量的对象依旧保持着价格高低的排序展现,只有销量不同的才会重新排序。(当然,如果需求不需要保持初始的排序意义,那么使用稳定性算法依旧将毫无意义)。

排序算法的稳定性判断原则及其意义相关推荐

  1. 排序算法的稳定性及其意义

    稳定性的定义 假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,ri=rj,且ri在rj之前,而在排序后的序列中,ri仍在rj之前,则称这 ...

  2. 判断各种排序算法的稳定性

    排序算法稳定性 如果在一个待排序的序列中,存在2个相等的数,在排序后这2个数的相对位置保持不变,那么该排序算法是稳定的:否则是不稳定的. 举个例子 对五个同学(A,B,C,D,E)进行成绩排序,他们的 ...

  3. 八大排序算法的稳定性及时间复杂度

    前言: 首先清楚何谓稳定性? 通俗地讲就是能保证排序前2个相等的数其在序列的前后位置顺序和排序后它们两个的前后位置顺序相同.在简单形式化一下,如果Ai = Aj,Ai原来在Aj位置前,排序后Ai还是要 ...

  4. 数据结构中各种排序算法的稳定性比较

    1.简单选择排序 2.堆排序        (1和2是属于选择排序) 3.直接插入排序 4.希尔排序     (3和4属于插入排序,有时把改进后的直接插入排序叫做二分插入) 5.冒泡排序        ...

  5. 选择排序总结以及排序算法的稳定性

    选择排序介绍: 选择排序(Selection sort)是一种简单直观的排序算法.它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始(末尾)位置,直到全部待排序的数 ...

  6. 常见的排序算法的稳定性

    分析一下常见的排序算法的稳定性,每个都给出简单的理由. 冒泡排序 冒泡排序就是把小的元素往前调或者把大的元素往后调.比较是相邻的两个元素比较,交换也发生在这两个元素之间.所以,如果两个元素相等,我想你 ...

  7. 【python】排序算法的稳定性冒泡排序(画图详细讲解)

    一.排序算法的稳定性 二.冒泡排序 a.重复比较相邻的元素,如果前面的比后面的大,就交换它们两个 b.每次遍历整个数组,遍历完成后,下一次遍历的范围往左缩1位 c.重复前面步骤,直到排序完成 三.代码 ...

  8. 数据结构与算法:排序算法的稳定性以及各性能比较python实现

    招聘笔试中经常会考到排序算法,在此做一个总结. 一.算法概念 1.排序算法的稳定性 假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,r[ ...

  9. 什么是排序算法的稳定性?

    什么是排序算法的稳定性? 今天来了解一下排序算法的稳定性的定义和一些常见排序算法的稳定性,一起来看看吧! 我们知道排序算法有时间.空间复杂度,那稳定性是什么意思呢?和它们有关吗? 文章目录 什么是排序 ...

最新文章

  1. flutter 刷脸_GitHub - nnnggel/baidu_face_plugin: 百度人脸识别和活体检测 Flutter 插件(目前版本仅支持 Android)...
  2. UITableViewCell 取消选中的蓝色背景
  3. 【PAT】A1060 Are They Equal *
  4. IBM HyperLedger fabric 详解
  5. SAP Analytics Cloud exception aggregation type设置成LAST的效果
  6. Mysql基本用法-01
  7. jQuery中国各个省份地图分部代码
  8. dedecms织梦模板|绿色仿下载吧网站织梦dede模板源码
  9. 史上最短命iPhone,销量惨淡、即将停产!
  10. mac下intellij idea 永久破解
  11. 关于练习美剧听写中碰到的问题
  12. ubuntu 14.04下练习lua
  13. 解读:计数器Counter
  14. 【目标跟踪】基于matlab帧差法结合卡尔曼滤波行人姿态识别【含Matlab源码 1127期】
  15. oracle分区实战,Oracle分区实战分享
  16. 域名备案、公安网备案
  17. java到达时间后自动执行代码_java设置按时间自动执行
  18. 微信小程序getUserProfile详解
  19. ML-czy的小组任务2
  20. typescript中的类型type与接口interface

热门文章

  1. Idea中Stash Changes功能clear之后恢复代码
  2. ```这个符号怎么打出来
  3. 【图像处理】白平衡原理及实现
  4. 模仿天猫实战【SSM】——总结
  5. mapstruct 之 类型转换
  6. mac实现sstp协议windows
  7. 线上展厅展台搭建方法汇总
  8. Android StatusBar 状态栏白底黑字设置
  9. android10.0的来电铃声代码流程,代码定位在哪里
  10. 苦等5年终于上会,毛戈平的“国潮”生意经能用多久?