排序算法总结

来源:互联网 发布:网络回路后果 编辑:程序博客网 时间:2024/06/08 05:26

排序总结


2、经典算法时间复杂度

O(1) < O(logn) < O(n) < O(nlogn) < O(n^2) < O(n^3) < O(2^n) < O(n!) < O(n^n)

快排的最坏情况:初始是逆序的,时间复杂度为n^2,最好情况每次选择的轴心最均匀,为logn


3、空间复杂度:

O(1):插入 选择 冒泡 希尔 堆排序

O(logN)~O(N):快排。快排这种算法需要栈的支持,栈的大小logn~n,所以最坏情况下为O(logn)~O(n)。每次递归传入参数left、right,平均递归次数是logn,所以平均空间复杂度为O(logn),最坏情况初始是逆序的,递归n次。

O(N):归并

O(M):计数排序 基数排序 ,m为桶数

堆排序如果采用递归实现的话,那么它的空间复杂度也是O(logn),如果采用非递归实现,则是O(1)


4、稳定性:

(1)稳定:冒泡 插入 归并 计数 基数 桶。

(2)不稳定:选择 快排 希尔 堆。

1)选择:2A  2B  2C 1,选最小的1和第一个2A交换-->1 2b 2c 2a 

2)堆:5a 5b 5c,最大堆5a是根 5c是右孩子(尾节点),此时根尾交换位置,5c 5b (5a) 最终结果为5c 5b 5a。

3)快排:4 3a 3b 3c 5如果选择3b为轴心,那么结果变成4 3a 3c 3b 5

4)希尔:5a 1a 1b 5b,步长为2,5a 1b比较 结果为1b 1a 5a 5b。

 

5、说明:

(1)快速排序和堆排序归并排序相比,虽然都是O(nlogn),但其常量系数相对而言比较低,所以叫快排

(2)工程排序:

1)工程排序是一种综合排序

2)数组较小时,选插入排序

数组较大时,选快排或其他时间复杂度为O(nlogn)的排序


排序相关题目:

(1)几乎有序的数组(如果数组排好序每个元素移动距离不大于k),选择哪种排序算法。

插入排序:与输入序列的顺序有关,对于这道题能够做到 O(nk),效果很好。快排、冒泡、选择、归并等都和原始顺序无关,所以时间复杂度还是原来的。

但该题目答案是,改进的堆排序算法。假设序列a[0~n],因为每个元素移动距离不超过k,所以最小值一定在a[0~k-1]中;将a[0~k-1]组成最小堆,堆顶就是最小值,弹出堆顶将其放到a[0]处。将a[k]放到堆顶,维持最小堆,此时第二小的数会出现在新堆顶,弹出堆顶放在a[1]处。接下来将a[k+1]放到堆顶,维持最小堆,弹出堆顶。每次弹出的元素有序。维持最小堆特性的时间复杂度为O(logk),即堆的大小<=k,共有n个元素,所以该排序算法的时间复杂度为O(nlogk)

(2)判断数组是否有重复值出现,要求空间复杂度为O(1)

如果不要求空间复杂度的话,应该选用哈希表方式实现(时间空间复杂度O(N))。要求空间复杂度为O(1)则先对数组进行原地排序,然后查看是否有相邻两个数相等适合该题目的排序算法最好为非递归版本的堆排序。

(3)两个有序数组a和b,将数组有序合并到a中(a的大小恰好为a+b的长度)

例如,a:2 4 6 ,b: 1 3 5。从后向前比较,a[2]和b[2]比较->a[5]=6; a[1]和b[2]比较->a[4]=5; a[1]和b[1]比较,a[3]=4.知道最后确定a[0]的值



原创粉丝点击