1. 直接插入排序
稳定性:稳定
时间复杂度:最好情况 O(N),最坏情况 O(N^2),平均情况 O(N^2)
空间复杂度:O(1)
算法思路:
- 从第一个元素开始,该元素可以认为已经被排序;
- 取出下一个元素,在已经排序的元素序列中从后向前扫描;
- 如果该元素(已排序)大于新元素,将该元素移到下一位置;
- 重复步骤 3,直到找到已排序的元素小于或者等于新元素的位置;
- 将新元素插入到该位置后;
- 重复步骤 2~5。
public static void insertSort(int[] array) {
for (int i = 1; i < array.length; i++) {
int tmp = array[i];
int j = i - 1;
for (; j >= 0; j--) {
if (array[j] > tmp) {
array[j + 1] = array[j];
} else {
break;
}
}
array[j + 1] = tmp;
}
}
2. 希尔排序
稳定性:不稳定
空间复杂度:O(1)
算法思路:
- 选择一个步长序列,建议初始步长 n/2,每次减半直到步长为 1;
- 对每个步长,对数组进行分组,对应位置相隔为步长的元素视为一组;
- 对每一组使用插入排序进行排序;
- 减小步长,重复步骤 2 和 3,直到步长减少到 1;
- 当步长为 1 时,相当于对整个数组做一次插入排序,此时数组已基本有序,所需的比较和移动次数大大减少。
public static void shellSort(int[] array) {
int gap = array.length / ;
(gap > ) {
( gap; i < array.length; i++) {
array[i];
i - gap;
(; j >= ; j -= gap) {
(array[j] > tmp) {
array[j + gap] = array[j];
} {
;
}
}
array[j + gap] = tmp;
}
gap /= ;
}
}


