插入排序
直接插入排序
- 先将 i 放在数组1下标,j 在数组的0下标,遍历数组,定义一个tmp保存i下标的值
- 循环比较tmp的大小和 j 下标的值,把大的值放在后面,j - -
- 当 j 遍历完数组或者不满足 j 下标值大于tmp时,将tmp赋给j+1
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 && array[j] > tmp; j--) {//array[j]>=tmp则不稳定
array[j+1] = array[j];
}
array[j+1] = tmp;
}
}
运行结果:
性能分析:
- 时间复杂度:最好(数据有序时):O(n) 最坏(数据逆序时):O(n^2)
- 空间复杂度:O(1)
- 稳定性[^1]:稳定
- 特点:越有序越快
希尔排序
又称缩小增量法。选定一个整数,将待排序文件中所有值分成几个组,所有距离为gap的值分在同一个组内,并对每一组进行排序,再取gap,重复,当gap=1时,数据就排好序了。
public static void shellSort(int[] array,int gap){
for (int i = gap; i < array.length; i++) {
int tmp = array[i];
int j = i-gap;
for (;j>=0 && array[j]>tmp;j--){
array[j+gap] = array[j];
}
array[j+gap] = tmp;
}
}
public static void shell(int[] array){
int gap = array.length;
while (gap > 1){
shellSort(array,gap);
gap = (gap/3)+1;//确保最后有一组
}
shellSort(array,gap);
运行结果:
性能分析:
- 时间复杂度:O(n^1.3 ) --O(n^1.5) 最坏:O(n^2)
- 空间复杂度:O(1)
- 稳定性:不稳定
比较直接插入排序和希尔排序的时间复杂度
生成1-100000以内的随机数,对他们进行排序,分别得到他们的时间复杂度
-
直接插入排序
-
希尔排序:
可以看出希尔排序比直接插入排序快些