常用的排序算法
编码中,常用的排序算法,我们使用到很多,你都用过那些,能说几个吗?
常用的排序算法有很多种,每种算法都有其特定的适用场景和优缺点。以下是几种常见的排序算法及其特点:
- 冒泡排序(Bubble Sort)
- 特点:通过重复遍历要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。
- 时间复杂度:平均和最坏情况下为O(n²),最好情况下为O(n)(当数组已经有序时)。
- 空间复杂度:O(1)。
- 稳定性:稳定。
- 选择排序(Selection Sort)
- 特点:每次从未排序部分选择最小(或最大)的元素,放到已排序部分的末尾。
- 时间复杂度:O(n²)。
- 空间复杂度:O(1)。
- 稳定性:不稳定。
- 插入排序(Insertion Sort)
- 特点:通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。
- 时间复杂度:平均和最坏情况下为O(n²),最好情况下为O(n)(当数组已经有序时)。
- 空间复杂度:O(1)。
- 稳定性:稳定。
- 快速排序(Quick Sort)
- 特点:通过一个“基准”元素,将数组分成两部分,一部分比基准小,一部分比基准大,然后递归地排序这两部分。
- 时间复杂度:平均情况下为O(n log n),最坏情况下为O(n²)(当每次选择的基准都是最大或最小元素时)。
- 空间复杂度:O(log n)(递归栈空间)。
- 稳定性:不稳定。
- 归并排序(Merge Sort)
- 特点:采用分治法,将数组分成两个子数组分别排序,然后合并两个有序子数组。
- 时间复杂度:O(n log n)。
- 空间复杂度:O(n)。
- 稳定性:稳定。
- 堆排序(Heap Sort)
- 特点:利用堆这种数据结构来实现排序,首先将数组构造成一个最大堆,然后依次取出堆顶元素。
- 时间复杂度:O(n log n)。
- 空间复杂度:O(1)。
- 稳定性:不稳定。
- 计数排序(Counting Sort)
- 特点:适用于一定范围内的整数排序,通过计数每个元素出现的次数来确定每个元素在排序后数组中的位置。
- 时间复杂度:O(n + k),其中k是整数的范围。
- 空间复杂度:O(k)。
- 稳定性:稳定。
- 基数排序(Radix Sort)
- 特点:适用于整数或字符串排序,通过逐位处理(从低位到高位或从高位到低位)来排序。
- 时间复杂度:O(nk),其中k是数字的位数或字符串的最大长度。
- 空间复杂度:O(n + k)。
- 稳定性:稳定。
- 桶排序(Bucket Sort)
- 特点:将数组元素分配到有限数量的桶中,每个桶分别排序,最后合并所有桶中的元素。
- 时间复杂度:平均情况下为O(n + k),最坏情况下为O(n²)。
- 空间复杂度:O(n + k)。
- 稳定性:稳定(取决于桶内排序算法)。
选择哪种排序算法取决于具体的应用场景,包括数据规模、数据特性(如是否有序、是否有重复元素等)以及对时间复杂度和空间复杂度的要求。
















