常用算法总结

常用排序算法比较

排序算法

简单描述(默认从小到大排序)

时间复杂度(平均情况)

适用场景

选择排序

找最小的元素,与第一个元素交换,再在剩下的元素中进行如上操作,直至排序完成。

交换次数为N,时间复杂度取决于比较次数。

O(N2

 

插入排序

从第一个元素开始,每次将下一个元素加入排序,直至排序完成。

O(N2

部分有序的数组;

小规模数组。

希尔排序

基于插入排序;

使数组中任意间隔为h的元素都是有序的。

小于O(N2),大于O(NlgN)

中等大小的数组,代码量小,不使用额外的内存空间;

解决排序问题又没有系统函数可以调用。

冒泡排序

从第一个元素开始,依次比较该元素和其下一个元素,如果该元素较大,则交换位置,再从第二个元素开始,如此这般,最后将最大的元素排到数组的最后一个元素,再在剩下的元素中进行如上操作,直至排序完成

O(N2

 

并归排序

自顶向下:将一个数组一分为二,将这两个小数组分别排序,再将这两个小数组归并为排好序的数组。运用这种思想到每一个数组,直到数组大小为1。

O(NlgN)

 

自底向上:把每个元素看成一个小数组,先两两并归,再四四并归,最终将所有元素并归到同一个数组中。

用链表组织的数据。

快速排序

选定一个切分元素,将数组一分为二,当两部分都有序时,整个数组也就有序了

O(NlgN)

大量数据的数组

三向切分快速排序:将数组分成三部分,分别对应小于、等于和大于切分元素的数组元素(等于部分在中间),当小于和大于部分都有序时,整个数组也就有序了。

数组中有许多重复数据出现。

堆排序

将数组进行优先队列排序,将第一个元素(也就是优先队列中最大的元素)和数组的最后一个元素进行交换,优先队列长度减一,重复此操作,直到优先队列长度变为1。

O(NlgN)

最优利用时间和空间。

 

常见排序算法时间复杂度及稳定性比较

排序方法

平均情况

最好情况

最坏情况

辅助空间

稳定性

冒泡排序

O(n^2)

O(n)

O(n^2)

O(1)

稳定

简单选择排序

O(n^2)

O(n^2)

O(n^2)

O(1)

稳定

直接插入排序

O(n^2)

O(n)

O(n^2)

O(1)

稳定

希尔排序

O(nlogn)~O(n^2)

O(n^1.3)

O(n^2)

O(1)

不稳定

堆排序

O(nlogn)

O(nlogn)

O(nlogn)

O(1)

不稳定

归并排序

O(nlogn)

O(nlogn)

O(nlogn)

O(n)

稳定

快速排序

O(nlogn)

O(nlogn)

O(n^2)

O(logn)~O(n)

不稳定

 

点赞