为了加快速度改进了插入排序,交换中间有间隔的元素对数组的局部进行排序,然后分开用插入排序将局部有序的数组进行数组排序,将间隔为h的数组编织在一起组成一个数组,称为h有序数组

数组中任意间隔为h的数值,都有序排列

对于任何以1为结尾的h序列,我们都能将数组排序

基本就是从大间隔到小间隔,不断的缩小间隔,然后进行相关的排序工作

public class ShellSort {

public static void sort(Comparable[] a) {//进行排序的方法

int N = a.length;//得到所的个数

int h = 1;//初始化希尔值

while (h<N/3)

h = h*3 +1;//保证不超过的情况获取最合适的希尔值,1,4,13

while(h>1){

for (int i = h; i < N; i++) {//一层遍历由N开始

for (int j = i; j >0 && less(a[j], a[j-h]); j-=h) {

//查找数组前面的希尔值,然后判断是否需要交换

exch(a, j, j-h);

}

}

h =h/3;//然后进行更深的排序,h更小;

}

}

public static boolean less(Comparable a,Comparable a2) {//对元素进行比较

return a.compareTo(a2) < 0;

}

private static void exch(Comparable[] a,int i,int j) {//进行交换

Object n =a[i];

a[i] = a[j];

a[j] = (Comparable<Object>) n;

}

private static void show(Comparable[] a) {

for (int i = 0; i < a.length; i++) {

System.out.println(a[i]+” “);

}//进行输出

}

public static boolean isSorted(Comparable[] a) {//测试是否排序

for (int i = 1; i < a.length; i++) {

if (less(a[i],a[i-1])) {

return false;

}

}

return true;

}

}

对于希尔排序,分为3份是最为合理的分法,然后我们逐步的缩小

对于越大的数组,性能更好

发表评论

邮箱地址不会被公开。 必填项已用*标注