以下是常见的排序算法汇总:
一、冒泡排序(Bubble Sort)
-
基本思想:
- 重复地走访要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。
-
时间复杂度:
- 平均情况和最坏情况都是 O (n²),最好情况(数据已经有序)为 O (n)。
-
空间复杂度:O (1)。
二、选择排序(Selection Sort)
-
基本思想:
- 首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。
-
时间复杂度:O (n²)。
-
空间复杂度:O (1)。
三、插入排序(Insertion Sort)
-
基本思想:
- 把待排序的数组分成已排序和未排序两部分,初始时,已排序部分只有一个元素,未排序部分包含所有剩余元素。每次从未排序部分取出一个元素,插入到已排序部分的适当位置,使得已排序部分始终保持有序。
-
时间复杂度:
- 平均情况和最坏情况为 O (n²),最好情况(数据已经有序)为 O (n)。
-
空间复杂度:O (1)。
四、希尔排序(Shell Sort)
-
基本思想:
- 先将整个待排序的记录序列分割成为若干子序列分别进行直接插入排序,待整个序列中的记录 “基本有序” 时,再对全体记录进行一次直接插入排序。
-
时间复杂度:
- 与增量序列的选择有关,平均情况和最坏情况比较复杂,在特定情况下可以达到 O (n (log n)²)。
-
空间复杂度:O (1)。
五、归并排序(Merge Sort)
-
基本思想:
- 采用分治策略,将待排序序列分成两个子序列,分别对两个子序列进行排序,然后将两个已排序的子序列合并成一个有序序列。
-
时间复杂度:O (n log n)。
-
空间复杂度:O (n)。
六、快速排序(Quick Sort)
-
基本思想:
- 通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。
-
时间复杂度:
- 平均情况为 O (n log n),最坏情况为 O (n²)。
-
空间复杂度:
- 平均情况为 O (log n),最坏情况为 O (n)。
七、堆排序(Heap Sort)
-
基本思想:
- 把待排序的序列构建成一个大顶堆或小顶堆,然后将堆顶元素与堆的最后一个元素交换,再对剩余的元素重新调整为堆,如此反复,直到整个序列有序。
-
时间复杂度:O (n log n)。
-
空间复杂度:O (1)。
八、计数排序(Counting Sort)
-
基本思想:
- 对于给定的输入序列中的每一个元素 x,确定该序列中值小于 x 的元素的个数,然后将 x 直接存放到最终的排序序列的正确位置上。
-
时间复杂度:O (n + k),其中 n 是输入序列的长度,k 是输入数据的范围。
-
空间复杂度:O (n + k)。
九、桶排序(Bucket Sort)
-
基本思想:
- 把数据分到有限数量的桶里,然后对每个桶中的数据分别进行排序,最后再把每个桶中的数据依次取出,组成有序序列。
-
时间复杂度:
- 平均情况为 O (n + k),其中 n 是输入序列的长度,k 是桶的数量。
-
空间复杂度:O (n + k)。
十、基数排序(Radix Sort)
-
基本思想:
- 将所有待比较数值统一为同样的数位长度,数位较短的数前面补零。然后,从最低位开始,依次进行一次排序。这样从最低位排序一直到最高位排序完成以后,数列就变成一个有序序列。
-
时间复杂度:O (n * k),其中 n 是输入序列的长度,k 是关键字的位数。
-
空间复杂度:O (n + k)。