常问问题(2)
1. 你知道的排序算法
1)冒泡排序:
从数组中第一个数开始,依次遍历数组中的每一个数,通过相邻比较交换,每一轮循环下来 找出剩余未排序数的中的最大数并“冒泡”至顶端。
稳定; 平均时间复杂度:O(n 2)
最好情况:顺序O(n);
最坏情况:逆序O(n2)
好处:稳定,而且可以适用于单向链表----其它排序方法基本不行
2)插入排序:
待排序的依次与已排序序列比较并寻找插入的位置,每次外循环结束后,将当前的数插入到合适的位置。
稳定; 平均时间复杂度:O(n 2)
复杂度应为(n+i) i为逆序对的个数 可知,对基本有序情况下效果好。
所以常常与其它排序方法结合,优化
有折半插入排序,稳定,n^2复杂度
3)希尔排序(缩小增量排序):
希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。
不稳定;平均时间复杂度:希尔排序算法的时间复杂度分析比较复杂,实际所需的时间取决于各次排序时增量的个数和增量的取值。时间复杂度在O(n ^ 1.3)到O(n ^ 2)之间。
增量不互质时,小增量不起作用
4)选择排序:
从所有记录中选出最小的一个数据元素与第一个位置的记录交换;然后在剩下的记录当中再找最小的与第二个位置的记录交换,循环到只剩下最后一个数据元素为止。
不稳定; 平均时间复杂度:O(n ^ 2)
(数组,交换 ----不稳定,可以稳定但需要额外的时/空 链表/新开)
5)快速排序
从待排序的n个记录中任意选取一个记录(通常选取第一个记录)为分区标准;(pivot 中枢)
把所有小于该排序列的记录移动到左边,把所有大于该排序码的记录移动到右边,中间放所选记录,称之为第一趟排序;
然后对前后两个子序列分别重复上述过程,直到所有记录都排好序。
不稳定; 平均时间复杂度:O(nlogn)
递归规模小的时候可用插入排序优化
有大量重复元素时退化
二路快排、三路快排
6)堆排序:
建立堆,然后删除堆顶元素,同时交换堆顶元素和最后一个元素,再重新调整堆结构,直至全部删除堆中元素。(最大堆)
不稳定; 平均时间复杂度:O(nlogn)
7)归并排序:
采用分治思想,现将序列分为一个个子序列,对子序列进行排序合并,直至整个序列有序。
稳定; 平均