希尔排序
一、希尔排序的产生
* 希尔排序是由科学家Donald L.Shell提出来的,希尔排序基于插入排序,
并添加了一些新的特性,从而大大的提高插入排序的执行效率。
二、插入排序的缺陷,多次的移动* 加入一个很小的数据在靠右端的位置上,那么要将该数据排序到正确的位置上,
则所有的中间数据都需要向右移动一位。
三、希尔排序的优点* 希尔排序通过加大插入排序中元素之间的间隔,并对这些间隔的元素进行插入排序,
从而使得数据可以大幅度的移动。当完成该间隔的排序后,希尔排序会减少数据的
间隔再进行排序。依次进行下去。
四、间隔的计算* 间隔h的初始值为1,通过h=3*h+1来循环计算,知道该间隔大于数组的大小时
停止。最大间隔为不大于数组大小的最大值
五、间隔的减少
* 可以通过公式h=(h-1)/3来计算。六、希尔排序代码实现
public class ShellSort {
/*
* 排序方法
* */
public static void sort(long[] arr){
//初始化一个间隔
int h=1;
//计算最大间隔,最大的间隔可以为1,4,13,40...
while(h<arr.length/3){
h=h*3+1;
}
while(h>0){
System.out.print("h="+h);
//进行插入排序
long tmp=0;
for(int i=h;i<arr.length;i++){
tmp=arr[i];
int j=i;//记录位置
while(j>h-1 && arr[j-h]>=tmp){
arr[j]=arr[j-h];
j-=h;//j=j-h;
}
arr[j]=tmp;
}
//减小间隔
h=(h-1)/3;
}
}
}
public class TestShellSort { public static void main(String[] args){ long[] arr=new long[7]; arr[0]=9; arr[1]=23; arr[2]=2; arr[3]=1; arr[4]=-4; arr[5]=34; arr[6]=23; arr[7]=2; arr[8]=1; arr[9]=-4; System.out.print("["); for(long num:arr){ System.out.print(num+" "); } System.out.print("]"); System.out.println(); ShellSort.sort(arr); System.out.print("["); for(long num:arr){ System.out.print(num+" "); } System.out.print("]"); System.out.println(); } }