排序_希尔排序
希尔排序类似插入排序,但是希尔排序是有间隔的,从代码中可以明显对比看出。希尔排序有三个标记值,一个是标记着临时数据,需要插入正确位置的数据,其每一次循环初始值都是outer指向的数值。另外两个是标记着需要比较的两个对象,outer和innner,outer的初始值是h,innner的初始值跟outer一样,跟插入不同的是innner的指针的移动是每隔h个往前移动,根据这个法则,只有当inner等于h时,才能进行最后一次的循环比较,所以innner〉h-1
希尔排序的最外层循环跟插入排序不同,插入排序是outter来决定的,希尔排序是由间隔数决定的。
public class ArraySh { private long [] a; private int nElems; public ArraySh(int maxSize) { a=new long[maxSize]; nElems=0; } //插入 public void insert(long value) { a[nElems++]=value; } //显示 public void display() { for(int j=0;j<nElems;j++) System.out.print(a[j]+" "); System.out.println(); } //排序 public void shellSort() { int inner,outer; long temp; int h=1;//间隔(通过计算) while(h<=nElems/3) h=h*3+1;//h由nElems来决定,循环过后,h的值就是真实的初始值 //h的改变,h的值来确定循环的次数 while(h>0) {//希尔排序与插入排序对比,多了一层外面的h循环 //每次循环outer的值是0+h for(outer=h;outer<nElems;outer++) { temp=a[outer]; inner=outer; //反着想,每隔h个,outer前面的数据都会是有序的,所以innner指向的数据不能是下标为h-1的数据的前面,不会对这个前面的数据进行比较 while(inner>h-1&&a[inner-h]>=temp) { a[inner]=a[inner-h]; inner-=h; } a[inner]=temp; } h=(h-1)/3; } } }
public class Test { public static void main(String[] args) { int maxSize=100; ArraySh array=new ArraySh(maxSize); array.insert(77); array.insert(99); array.insert(44); array.insert(55); array.insert(22); array.insert(88); array.insert(11); array.insert(0); array.insert(66); array.insert(33); array.display(); array.shellSort(); array.display(); } }