排序
插入排序
直接插入排序
时间复杂度:$O(n^2)$
最好情况:$O(n)$
最坏情况:$O(n^2)$
空间复杂度:$O(1)$
稳定性:稳定
适用性:适用于顺序储存和链式储存的线性表
1 | void sort(int arr[], int len) { |
折半插入排序
折半插入排序仅减少了元素比较的次数,元素移动次数并未改变,因此时间空间复杂度并没有发生改变
时间复杂度:$O(n^2)$
最好情况:$O(n)$
最坏情况:$O(n^2)$
空间复杂度:$O(1)$
稳定性:稳定
适用性:仅适用于顺序储存的线性表
1 | void sort(int arr[], int len) { |
希尔排序
时间复杂度:尚未可知
最好情况:约为$O(n^{1.3})$
最坏情况:约为$O(n^2)$
空间复杂度:$O(1)$
稳定性:不稳定
适用性:仅适用于顺序储存的线性表
1 | /** |
交换排序
冒泡排序
时间复杂度:$O(n^2)$
最好情况:$O(n)$
最坏情况:$O(n^2)$
空间复杂度:$O(1)$
稳定性:稳定
适用性:适用于顺序储存和链式储存的线性表
1 | /** |
冒泡排序实现方式千变万化,不必拘泥于某种特定实现方式,如下两种,均有不同
1 | /** |
快速排序
时间复杂度:大多数情况下更接近$O(n\log _2n)$
最好情况:$O(n\log _2n)$
最坏情况:$O(n^2)$
空间复杂度:$O(\log _2n)$
稳定性:不稳定
适用性:仅适用于顺序储存的线性表
1 | int part(int arr[], int low, int high) { |
选择排序
简单选择排序
时间复杂度:$O(n^2)$
最好情况:$O(n^2)$
最坏情况:$O(n^2)$
空间复杂度:$O(1)$
稳定性:不稳定
适用性:适用于顺序储存和链式储存的线性表
1 | void sort(int arr[], int len) { |
堆排序
时间复杂度:$O(n\log _2n)$
空间复杂度:$O(1)$
稳定性:不稳定
适用性:仅适用于顺序储存的线性表
1 | /** |
其实adjust
中直接进行结点与结点的值交换也可以
1 | void adjust(int arr[], int p, int len) { |
归并排序
时间复杂度:$O(n\log _2n)$
空间复杂度:$O(n)$
稳定性:稳定
适用性:适用于顺序储存和链式储存的线性表
1 | /** |