0.算法解決的問題
為了減少插入排序(樸素的排序算法)所耗時間诱篷,我們采取一種基于其原理的革屠,但是不同思想的算法.
1.輸入與輸出
- 輸入:亂序的數(shù)組
- 輸出:排好序的該數(shù)組
2.算法思想
把數(shù)組中間隔為h的元素取出來看作一個單獨的數(shù)組進行排序瘾婿。假設(shè)h=3洗搂,
那么可以把數(shù)組分為
a[0],a[3],a[6]……
a[1],a[4],a[7]……
a[2],a[5],a[8]……
所謂的h有序數(shù)組
如上圖所示,先將拆分過后的小數(shù)組進行排序凝果,縮小h后再次排序。直到h=1睦尽,排序完成器净。
3.偽代碼及注釋
三個循環(huán)分別代表:h值不斷縮小,一個h值中排序的組不斷變化当凡,插入排序山害。
4.java代碼實現(xiàn)
public static int[] shellSort(int[] a)
{
int temp=0;
int n = a.length;
int h,j;
for (h = n / 2; h > 0; h /= 2)
for (j = h; j < n; j++)//從數(shù)組第h個元素開始
if (a[j] < a[j - h])//每個元素與自己組內(nèi)的數(shù)據(jù)進行直接插入排序
{
temp = a[j];
int k = j - h;
while (k >= 0 && a[k] > temp)
{
a[k + h] = a[k];
k -= h;
}
a[k + h] = temp;
}
return a;
}
5.復(fù)雜度
對于近似有序的數(shù)組來說纠俭,插入算法的速度是很快的。
相比于傳統(tǒng)的插入算法浪慌,希爾算法每次將元素移動的距離增大了h冤荆,這解決了移動距離遠的情況下移動距離次數(shù)多這一問題。
6.優(yōu)缺點及適用范圍
適用于大型的权纤,靜態(tài)的數(shù)據(jù)庫钓简。