1. 程式人生 > >演算法學習——希爾排序

演算法學習——希爾排序

希爾排序的思想就是將排序物件分為步長序列進行插入排序,步長序列的增量是遞減的,那麼什麼是步長序列呢?簡單的說就是將一個大的序列按照固定的增量分為若干個小的序列,當數字作為序列的下標時,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]+" ");
		}
	}
}

執行結果為: