演算法學習——希爾排序
阿新 • • 發佈:2019-01-04
希爾排序的思想就是將排序物件分為步長序列進行插入排序,步長序列的增量是遞減的,那麼什麼是步長序列呢?簡單的說就是將一個大的序列按照固定的增量分為若干個小的序列,當數字作為序列的下標時,1,3,5,7,9就是一個步長序列,仔細考慮考慮不難理解,若一個長度為10的序列,將其按照增量為5來分段,此時要進行插入排序的分別是下標為0和5,1和6,2和7,3和8,4和9的元素,話不多說,咱們直接來看程式碼:
package pp.suanfa; /** * 希爾排序 * @author xiaoGd * */ public class TestShell { public static void shellSort(int array[]) { int length = array.length; int i,j; int h; int temp; for(h=length/2;h>0;h=h/2)//第一層for迴圈用來確定步長序列的增量 { for(i=h;i<length;i++)//第二層for迴圈用來確定每段步長序列進行插入排序的基準數 { temp = array[i];//1.temp = array[i]; for(j=i-h;j>=0;j-=h)//第三層for迴圈用來將每段步長序列中其它的數同基準數進行比較 { if(temp<array[j]) { array[j+h] = array[j];//2.array[i] = array[j]; } else break; } array[j+h] = temp;//3.array[j] = temp; 因為執行完j-=h;後,j+h就等於for迴圈中的j //通過上面的1、2、3步完成位置的互換 } } } public static void main(String[] args) { int i = 0; int[] a = {5,4,9,8,7,6,0,1,3,2}; int len = a.length; shellSort(a); for(i=0;i<len;i++) { System.out.print(a[i]+" "); } } }
執行結果為: