《Java数据结构和算法》Seven 高级排序 希尔排序

希尔排序基于插入排序,通过加大排序中元素之间的间隔,并在这些有间隔的元素中进行插入排序,使数据项大跨度的移动。当这些数据项排过一趟序后,希尔排序算法减小数据项之间的间隔,依次下去直到间隔为1,成为普通插入排序。如下图,以4为间隔的排序的全过程:将0、4、8位对应的数据进行排序,接着右移一位对1、5、9对应位进行排序……以4为间隔排序进行完后数组基本有序。

《Java数据结构和算法》Seven 高级排序 希尔排序_第1张图片

 package Structure;

class ArraySh{
 private long[] theArray;
 private int nElems;
 
 public ArraySh(int max){
  theArray = new long[max];
  nElems = 0;
 }
 
 public void insert(long value){
  theArray[nElems] = value;
  nElems++;
 }

 public void display(){
  System.out.print("A= ");
  for(int j=0;j<nElems;j++)
   System.out.print(theArray[j]+" ");
  System.out.println("");
 }
 
 public void shellSort(){
  int inner,outer;
  long temp;
  
  int h = 1;//h 的初值为1
  
  while(h < nElems/3)
  
   h = h * 3 + 1;//将h增至范围内的最大间隔,之后按公式减小间隔(1、4、13、40...)
 
  while(h>0){
   for(outer=h;outer<nElems;outer++){
    temp = theArray[outer];
    inner = outer;
    
    //以上例来说将以4为间隔的数据排序(0.4.8)
    
    while(inner>h-1&&theArray[inner-h]>=temp){
     theArray[inner] = theArray[inner-h];
     inner -= h;
    }
    theArray[inner] = temp;
   }
   
   h = (h-1) / 3;//逐渐缩小间隔 直至为1
 
  }
 }
}
public class ShellSort {
 public static void main(String[] args){
  int maxSize = 10;
  ArraySh arr;
  arr = new ArraySh(maxSize);
  for(int j=0;j<maxSize;j++){
   long n = (int)(java.lang.Math.random()*99);
   arr.insert(n);
  }
  arr.display();
  arr.shellSort();
  arr.display();
 }
}

 

你可能感兴趣的:(《Java数据结构和算法》Seven 高级排序 希尔排序)