排序演算法2---希爾排序
阿新 • • 發佈:2018-11-09
希爾排序
- 基本思想:希爾排序是插入排序的一個變種。不同之處在於我們按步長gap分組,對每組的記錄採用直接插入排序,隨著步長的逐漸減少,分組包含的記錄越來越多,直到gap=1時,構成了一個有序記錄。
- 時間複雜度: O(n^1.25) ~ 1.6*O(n^1.25)
- 空間複雜度: O(1)
- 穩 定 性 :不穩定
- 適用場景:資料量較大
下圖中為了方便,對gap以gap/2來計算,但最優的演算法是gap/3+1。
void ShellSort(int* arr, int size)
{
if (arr == NULL || size <= 0)
return;
int gap = size;//gap為增量
while (gap > 1)
{
gap = gap / 3 + 1;//這樣給是最優的
for (int idx = gap; idx < size; ++idx)
{
int end = idx - gap;//分組後,當前元素的前一個元素
int key = arr[idx];//儲存當前元素
//按升序排序
while (end >= 0 && arr[end] > key)
{
arr[end + gap] = arr[end];
end -= gap;
}
arr[end + gap] = key;
}
}
}