为啥把插入排序,希尔排序,归并排序纳入一类排序思想
插入排序,希尔排序,归并排序这三种排序方式其实是依次优化的,希尔排序是插入排序的一种升级,归并排序是插入算法的升级,效率比希尔排序还好
时间复杂度 : 插入排序 > 希尔排序 > 归并排序
(ps :如果在学习这三个算法之前需要掌握 时间复杂度计算方式 递归 和 插入算法 链接如下
1.递归&分治&回溯
2.时间复杂度
3.插入排序
)
希尔排序就是在插入排序的基础上,将一个数组按照一个增量分组,数组索引为n和 n+d的倍数为一组,每次增量都是按照 d = d/2的方式递减
比如 一个数组是 2,7,1,4,8,6,9
那么第一次 增量d 就是数组的长度 7/2 = 3;
那么 可以分为 [2,4,9],[7,8],[1,6] 三组每组进行一次插入排序变成 2,7,1,4,8,6,9
然后,再将组按照d=d/2分成更小的组, d = 3/2 = 1;在进行一次插入排序
变成 1,2,4,6,7,8,9
public class ShellSort {
public static void main(String[] args) {
int array[] = {2,7,1,4,8,6,9};
shellSort(array,array.length/2);
}
static int count =0;
/**
*
* @param array
* @param
*/
public static void shellSort(int array[],int d){
if (array == null || d<= 0 ){
return;
}
count++;
//lar 分组
for (int lar = 0;lar < d;++lar){
//这里面是一个插入算法
for (int i =d;i <array.length; i = i+d){
int temp = array[i];
int j = i-d;
for (;j>=0;j = j-d){
if (temp < array[j]){
array[j+d] = array[j];
}else {
break;
}
}
array[j+d] = temp;
}
}
String arSt = "";
for (int i =0;i< array.length;++i){
arSt += array[i] + " ";
}
System.out.println("第 " +count + " 次分组排序的结果: " +arSt);
d = d/2;
shellSort(array,d);
}
}
输出结果
第 1 次分组排序的结果: 2 7 1 4 8 6 9
第 2 次分组排序的结果: 1 2 4 6 7 8 9