排序算法稳定性
- 保证排序前2个相等的数其在序列的前后位置顺序和排序后它们两个的前后位置顺序相同。 再简单形式化一下,如果Ai = Aj,Ai原来在位置前,排序后Ai还是要在Aj位置前。
内排序和外排序:
- 内排序是在排序的整个过程中,待排序的所有记录全部被放置在内存中。
- 外排序是由于排序记录个数太多,不能同时放置在内存,整个排序过程需要在内外存之间多次交换数据才能进行。
冒泡排序:
基本思想:两两比较相邻记录的关键字,如果反序,则交换,直到没有反序的记录为止。
改进思路:可以设置哨兵和flag,来避免不必要的循环,来提升性能。
简单选择排序:
基本思想:在数据每次都选取一个最小的,放进有序序列中。
算法特点:交换移动数据次数相对少。(不是数据比较次数)
直接插入排序:
基本思想:将一个记录插入到已经排好序的有序表中,从而得到一个新的,记录数增加1的有序表。
卡牌游戏的插牌。
希尔排序:
基本思想:将原来大量数据进行分组。将子序列分别进行直接插入排序,当整个序列基本有序时,在对全体继续进行一次直接插入排序。
分割策略:将相距某个“增量”的记录组成一个子序列。
改进思路:“增量”的选择。 且增量为递减。
堆排序:
大顶堆:每个节点的值都大于或等于其左右孩子节点的值。
基本思想:把等待排序的序列构造成一个大顶堆,吧堆顶移走(把堆顶与堆数组的末尾元素交换,此时末尾元素就是最大值),重新构建一个新的堆,然后反复执行。
归并排序(二路归并排序)
基本思想:假设有N条数据,则看做N个有序的子序列,每个子序列的长度为1,然后两两归并,如此重复,直到得到一个长度为N的有序序列。
缺点:大量递归,造成时间和空间上的性能损耗。
优化:将递归修改为迭代。
快速排序:
基本思想:通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,再分别的对两部分进行排序。
按照内外排序分类
- 内排序可以分为以下几类:
(1)、插入排序:直接插入排序、二分法插入排序、希尔排序。
(2)、选择排序:简单选择排序、堆排序。
(3)、交换排序:冒泡排序、快速排序。 - 外排序可以分为一下几类:(既使用内部存储也使用外部存储,内存不够时建议使用):
(1)、归并排序
(2)、基数排序
按照稳定性分类
- 不稳定:简单选择排序、快速排序、希尔排序、堆排序不是稳定的排序算法
- 稳定:冒泡排序、直接插入排序、二分法插入排序,归并排序和基数排序都是稳定的排序算法。
排序算法的选择
1.数据规模较小
(1)待排序列基本序的情况下,可以选择直接插入排序;
(2)对稳定性不作要求宜用简单选择排序,对稳定性有要求宜用插入或冒泡
2.数据规模不是很大
(1)完全可以用内存空间,序列杂乱无序,对稳定性没有要求,快速排序,此时要付出log(N)的额外空间。
(2)序列本身可能有序,对稳定性有要求,空间允许下,宜用归并排序
3.数据规模很大
(1)对稳定性有求,则可考虑归并排序。
(2)对稳定性没要求,宜用堆排序
4.序列初始基本有序(正序),宜用直接插入,冒泡
1044

被折叠的 条评论
为什么被折叠?



