排序算法的稳定性及其意义
2018-02-21 12:59
253 查看
稳定性的定义 假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,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){ /*如果改为[b]a[j].key >=a[j+1].key,就不稳定咯*/[/b] flag = 1;temp = a[j];a[j] = a[j+1];a[j+1] = temp; }}}} 常见算法的稳定性(要记住)堆排序、快速排序、希尔排序、直接选择排序不是稳定的排序算法,而基数排序、冒泡排序、直接插入排序、折半插入排序、归并排序是稳定的排序算法。稳定性的意义1、如果只是简单的进行数字的排序,那么稳定性将毫无意义。
2、如果排序的内容仅仅是一个复杂对象的某一个数字属性,那么稳定性依旧将毫无意义(所谓的交换操作的开销已经算在算法的开销内了,如果嫌弃这种开销,不如换算法好了?)
3、如果要排序的内容是一个复杂对象的多个数字属性,但是其原本的初始顺序毫无意义,那么稳定性依旧将毫无意义。
4、除非要排序的内容是一个复杂对象的多个数字属性,且其原本的初始顺序存在意义,那么我们需要在二次排序的基础上保持原有排序的意义,才需要使用到稳定性的算法,例如要排序的内容是一组原本按照价格高低排序的对象,如今需要按照销量高低排序,使用稳定性算法,可以使得想同销量的对象依旧保持着价格高低的排序展现,只有销量不同的才会重新排序。(当然,如果需求不需要保持初始的排序意义,那么使用稳定性算法依旧将毫无意义)。
2、如果排序的内容仅仅是一个复杂对象的某一个数字属性,那么稳定性依旧将毫无意义(所谓的交换操作的开销已经算在算法的开销内了,如果嫌弃这种开销,不如换算法好了?)
3、如果要排序的内容是一个复杂对象的多个数字属性,但是其原本的初始顺序毫无意义,那么稳定性依旧将毫无意义。
4、除非要排序的内容是一个复杂对象的多个数字属性,且其原本的初始顺序存在意义,那么我们需要在二次排序的基础上保持原有排序的意义,才需要使用到稳定性的算法,例如要排序的内容是一组原本按照价格高低排序的对象,如今需要按照销量高低排序,使用稳定性算法,可以使得想同销量的对象依旧保持着价格高低的排序展现,只有销量不同的才会重新排序。(当然,如果需求不需要保持初始的排序意义,那么使用稳定性算法依旧将毫无意义)。
相关文章推荐
- 排序算法的稳定性及其意义
- 8种排序算法及其稳定性
- 排序算法 及其稳定性解释
- 各种排序算法思想及其稳定性总结
- 排序稳定性的意义 常见排序算法的稳定性分析
- 转载]排序算法的稳定性
- COM在注册表中的相关键值及其意义
- vb6,vs2005快捷键_排序算法的稳定性
- 各种排序算法的稳定性和时间复杂度小结
- BIOS自检响铃及其意义
- 各种排序算法的稳定性和时间复杂度小结
- 非线性的概念、性质及其哲学意义
- JRockit的-Xgc参数及其意义
- 浅谈ssh(struts,spring,hibernate三大框架)整合的意义及其精髓
- 排序算法之五--冒泡排序及其改进
- 常见排序算法的稳定性
- 浅说镜头的MTF值 及其对市场流行镜头的实际指导意义
- 关于IoC、低耦合、配置文件及其本质意义的思考
- 【数据结构】01.8种排序算法的稳定性和时间复杂度小结
- 排序算法的稳定性