希尔排序是将系列根据小标增量分组,增量是一个递减的,直到增量为1 就是原始的直接插入排序
int[] data = {0,5,4,8,9,3,2,67,23};
len = 8
1、取增量increment = len /2 = 4
data[0] data[4] data[8] 为一组
data[1] data[5] 为一组
data[2] data[6] 为一组
。。。。。
每组排序完,将增量较小,继续分组
2、取增量increment /= 2 ,得到increment = 2;
。。。。。
对下面插入排序,下标对应修改,不然真的伤神,估计也很难搞出希尔排序;
改为希尔排序发现之前写的直接插入排序掉了一个逻辑判断
if(i == 0) data[i]=insert_data;
/*
for(int start_index = 1;start_index <= len -1;start_index++){
int insert_data = data[start_index];
for(int i = start_index -1;i >=0;i--){
if(data[i]>insert_data){
data[i+1]=data[i];
}else{
data[i+1]=insert_data;
break;
}
if(i == 1) data[i]=insert_data;
}
}*/
修改下表后希尔排序
int[] data = {0,5,4,8,9,3,2,67,23};
int len = data.length;
for(int incrment = len/2;incrment >=1;incrment/=2){
for(int j =0;j<incrment;j++){
for(int start_index = j+incrment;start_index<=len-1;start_index+=incrment){
int insert_data = data[start_index];
for(int k = start_index-incrment;k >=j;k-=incrment){
if(data[k]>insert_data){
data[k+incrment]=data[k];
}else{
data[k+incrment]=insert_data;
break;
}
if(j==k) data[k]=insert_data;
}
}
}
/*
for(int start_index = 1;start_index <= len -1;start_index++){
int insert_data = data[start_index];
for(int i = start_index -1;i >=0;i--){
if(data[i]>insert_data){
data[i+1]=data[i];
}else{
data[i+1]=insert_data;
break;
}
if(i == 1) data[i]=insert_data;
}
}*/
}