简述8种排序的思路

(1)插入排序

【思路】:将队列分为有序区和无序区两部分,每次都从无序区选第一个插入到前面的有序区中的正确位置。插入前需要移动元素。

【性能】:直接插入排序是稳定排序,时间复杂度为O(n^2),不需要额外空间。

java代码实现:

(2)希尔排序

【思路】:本质是分组插入排序。先将整个待排序的序列用增量分割成为若干子序列分别进行直接插入排序,逐步减少增量,直至增量为1时即对全体记录进行直接插入排序。(初始增量为n/2,逐步减半,n为序列元素个数)

【性能】:希尔排序是不稳定排序,性能难以分析。

java代码实现:

(3)选择排序

【思路】:将队列分为有序区和无序区两部分。选出最小(或者最大)的一个数与第1个位置的数交换,然后在剩下的数当中再找最小(或者最大)的与第2个位置的数交换,依次类推。

【性能】:选择排序是不稳定排序,时间复杂度为O(n^2),不需要额外空间。

java代码实现:

(4)堆排序

【思路】:利用堆来快速选出最大或最小的数。建立初始堆后,每次交换堆顶和最后一个元素,输出该堆顶,然后重新调整堆。重复该过程。

【性能】:堆排序是不稳定排序,时间复杂度为O(nlogn)。

【补充】:二叉堆是一棵完全二叉树,堆中任意节点的值总是不大于(不小于)其子节点的值,一般用数组实现。

java代码实现:

(5)冒泡排序

【思路】:每当两相邻的数比较后发现它们的排序与排序要求相反时,就将它们互换。使关键字最大的记录如气泡一般逐渐往上“漂浮”直至“水面”。

【性能】:冒泡排序是稳定排序,时间复杂度为O(n^2),不需要额外空间。

java代码实现:

(6)快速排序

【思路】:每轮选择一个基准元素(比如第一个),将待排序的记录分割成两部分,一部分的元素值均比基准元素值小,另一部分比基准值大,然后分别对这两部分用同样的方法排序。一般基于递归实现。冒泡排序每次只调整了一个数或几个数的相对关系,而快速排序每遍都让两边保持相对关系。

【性能】:快速排序是不稳定排序,时间复杂度为O(nlogn)。快速排序是通常被认为在O(nlog2n)的排序方法中平均性能最好的,但最坏情况下快速排序退化为O(n^2)。

java代码实现:

(7)归并排序

【思路】:先将序列逐级分为子序列,然后再一层层向上归并。是分治法的典型应用。

【性能】:归并排序是稳定排序,时间复杂度为O(nlogn)。需要O(n)的额外空间。

java代码实现:

(8)基数排序

【思路】:基数排序是通过“分配”和“收集”过程来实现排序,而不是通过数据比较。如先按个位分类,然后按十位、百位以此类推。

【性能】:假设在基数排序中,r为基数,d为位数。则基数排序的时间复杂度为O(d(n+r))。对于任何位数上的基数进行“装桶”操作时,都需要n+rd个临时空间。是稳定排序算法。

java代码实现:

推荐阅读更多精彩内容