排序算法

前言

稳定性:如果一个排序算法能够保留数组中重复元素的相对位置则可以被称为是稳定的

不稳定算法:如选择排序,希尔排序,快速排序和堆排序

算法

是否稳定

是否为原地排序

时间复杂度

空间复杂度

备注

选择排序

N2

1

取决于元素的排列情况

插入排序

N~N2

1

取决于元素的排列情况

希尔排序

NlogN? N1.2?

1

取决于元素的排列情况

快速排序

NlogN

lgN

运行效率由概率提供保证

三向快速排序

N~NlogN

lgN

运行效率由概率提供保证,同时也取决于输入元素的分布情况

归并排序

NlogN

N

堆排序

NlogN

选择排序

运行时间和输入无关 对于长度为n的数组,选择排序需要大约n2/2次比较和n次交换 稳定 时间复杂度O(n2)

for(int i = 0; i < n; i++) {
  int minIdx = i;
  for(int j = i+1; j < n; j++) {
    if(nums[j] < nums[minIdx]) {
      minIdx = j;
    }
  }
  swap(nums,i,minIdx);
}

插入排序

运行时间与输入状态有关 对于长度为n的数组,平均情况下需要n2/4次比较,n2/4次交换 最坏情况下需要n2/2次比较,n2/2次交换 最好情况下需要n-1次比较和0次交换

对于部分有序的数组十分高效

希尔排序

归并排序

自顶向下的归并排序

自底向上的归并排序

快速排序

三向切分的快速排序

对于存在大量重复元素的数组,这种方法比标准的快速排序的效率高得多

堆排序

最后更新于