排序的稳定性
稳定 A B A 为AAB,两个A的相对位置能够保证不变
不稳定 A B A 为AAB,两个A的相对位置不保证不变
根据在排序过程中待排序的记录是否全部被放置在内存中,排序分为:内排序和外排序
内排序是在排序整个过程中,待排序的所有记录全部被放置在内存中。
外排序是由于排序的记录个数太多,不能同时放置在内存,整个排序过程需要在内外存之间多次交换数据才能进行。
排序算法的性能:
1时间性能
2辅助空间
3算法复杂性
内排序:插入、交换、选择、归并排序
冒泡排序 谭浩强C P147
选择排序 谭浩强C P197
冒泡排序
时间复杂度O(n^2)
简单选择排序
最大特点:交换移动数据次数少,性能上还是优于冒泡排序
时间复杂度O(n^2)
直接插入排序
最大特点:只需要一个记录的辅助空间。时间复杂度上,比冒泡和简单选择排序还要好一点
时间复杂度O(n^2)
希尔排序
第一个突破O(n^2)的排序算法;在直接插入排序基础上改进
将相隔某个 增量的记录,组成一个子序列,实现跳跃性的移动,使得排序的效率提高
不是一种稳定的排序算法。
选择好的增量序列
时间复杂度,不一定,在O(nlogn) ~O(n^2) 范围之间
堆排序 Heap Sort
与简单选择排序同属选择排序
大顶堆
小顶堆
堆排序复杂度:主要消耗在,初始化堆O (n)和重建堆的反复筛选上O(nlogn)
最好、最坏、平均时间复杂度都是O(nlogn)
是一种不稳定的排序方法
堆排序(Heapsort)之Java实现
快速排序,情绪化的天才,稍有不慎发挥就不好
归并排序,需要O(n)的空间复杂度,
堆排序,少量索取,大量副处,O(1)的空间复杂度
稳定性上,归并排序独占鳌头
简单选择排序看似各种被虐,其实不然。他的移动次数是很少的,因为它通过大量比较后明确选择记录才进行移动,有的放矢。