希尔排序(Shell Sort)是插入排序的一种。也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本。
希尔排序使用一个序列h1,h2….ht,叫做增量序列,当ht=1时,其实就是插入排序了,但在插入排序进行前,就已经进行跨多元素间的(插入排序),而插入排序只能以1的元素间隔进行比较排序。
希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。
import java.util.Random;
/**
* 希尔排序-基于插入排序增加增量概念,能横跨多个元素进行比较
* @author moxianbin
*/
public class ShellSort {
/**
* 组建随机数组
* @param len
* @return
*/
public static int[] get_intarr(int len){
long begin = System.currentTimeMillis();
Random ran = new Random();
int [] result = new int[len];
for(int i=0;i<len;i++){result[i] = ran.nextInt(10000); }
long runtime = System.currentTimeMillis()-begin;
System.out.println("组件随机数组运行时间:"+runtime);
return result;
}
/**
* 核心排序方法
* @param a
*/
public static void sort(int []a){
long begin = System.currentTimeMillis();
for(int gap = a.length/2;gap>0;gap/=2){
for(int i=gap;i<a.length;i++){
int tmp = a[i];
for(int j=i-gap;j>=0 && a[j]>tmp;j-=gap){
if(a[j]>tmp){
a[j+gap]=a[j];
a[j] = tmp;
}
}
}
}
long runtime = System.currentTimeMillis()-begin;
System.out.println("排序运行时间:"+runtime);
}
public static void main(String[] args) {
int [] a = get_intarr(10000);
sort(a);
// for(int i=0;i<a.length;i++){System.out.println(a[i]);}
}
}