定义:
希尔排序输入插入排序,是一种分组插入排序。他比插入排序的优点在于可以减少时间复杂度,即减少数据移动次数
即,给定一个数组,取一个小于数组长度的间隔n,从数组的小标0开始,在数组长度范围内,每隔n取一个数,放在一起,这样会形成一个分数组,然后对这几个分数组进行插入排序。
如:数组:98, 485, 58, 486, 482, 782, 1657
先去增量为 3
98 486 1657 对其进行插入排序 98 486 1657
485 482 对其进行插入排序 485 482
58 782 对其进行插入排序 58 782
新的数组: 98 485 58 486 482 782 1657
.......
.......
.......
这样继续减小增量,直到增量为1;为1的时候即是对数组直接进行插入排序。
代码实现如下:
package xier;
import java.util.Arrays;
public class XiErDemo {
public static void main(String arr[]){
int []cc={34,5,46,7,8,86,24,69,0,256,79};
xier(cc);
System.out.println(Arrays.toString(cc));
}
private static void xier(int[] cc) {
if(cc.length/2<=1){
//表示数组的长度不大于2,则没必要分组,直接插入
return ;
}
int length=cc.length;
while(true){
length=length/2;
if(length<1){//如果分组的长度小于一,则表示排序已经结束
break;
}
//对每一个分组间隔进行插入排序
InsertSort(cc,length);
}
}
/**
* @param arr 要排序的数组
* @param n 分组间隔*/
public static void InsertSort(int []arr,int n){
for(int x=0;x<n;x++){
for(int i=x+n;i<arr.length;i=i+n){
int temp=arr[i];
int in=i-n;
while(in>=0&&arr[in]>temp){
arr[in+n]=arr[in];
in=in-n;
}
in=in+n;
arr[in]=temp;
}
}
}