1 template <class Item> 2 void shellsort(Item a[], int l, int r) 3 { int h; 4 for (h = l; h <= (r-l)/9; h = 3*h+1) ; 5 for ( ; h > 0; h /= 3) 6 for (int i = l+h; i <= r; i++) 7 { int j = i; Item v = a[i]; 8 whlie (j >= l+h && v < a[j-h]) 9 { a[j] = a[j-h]; j -= h; } 10 a[j] = v; 11 } 12 }
插入排序運行效率較低的原因是它所執行的交換操作涉及鄰近的數據項,使得數據項每次只能移動一位。例如,如果鍵最小的數據項剛好在數組的尾端,就需要N步來將該項放到數組的最前端。shell排序法是插入排序的擴展,它通過允許非相鄰的數據項進行交換來提高效率。
該算法將文件重新安排,使文件具有這樣的特性,每第h個文件(從任何地方開始)組成一個排好序的文件。另一種說法就是,已h-排序的文件是h個獨立的已排好序的文件,相互交叉在一起。對h值較大的h-排序文件,可以通過移動相距較遠的元素使文件比較容易地進行h值較小的h-排序。通過按照任意以1結束的步長序列進行操作,就產生了一個排好序的文件:這就是shell排序法的本質。
性質:對既已h-排序又k-排序的文件進行g-排序時所執行的比較操作數小於N(h-1)(k-1)/g,假設h和k是互質的。
由於即使對大文件,shell排序法都具有較高的運行效率以及代碼簡單容易執行,很多排序應用程序都選用了shell排序法。如果你需要快速的解決一個排序問題,而且不會涉及系統排序,你可以使用shell排序法,然后遲點時間再考慮是否需要用一個更完備的算法代替它。