排序演算法3 希爾排序

2021-09-02 08:14:58 字數 1540 閱讀 4827

此篇我是17年7月份有幸閱讀到morewindows的此篇部落格 希爾排序 可惜的是當時不是很懂。又因工作繁忙以至於忘了此事。直到最近換完工作才有想起有此坑還未填上,便又翻出看了一遍。這次有了全新的認識。特此記錄

現在才想起當時為何看的不是很懂,是因為此篇部落格中的實驗中間省略了一小部分。看似省略的這一小部分,卻讓我當時深深疑惑。還好現在已經按照部落格中的意思將內容補細緻一些。下面的**注釋部分,有我當時寫**是的錯誤思路及反思。

#include #include /*

希爾排序的實質是分組插入排序,又稱縮小增量排序。

基本思想:

先將整個待排元素序列分割成若干子串行(由相隔某個「增量」的元素組成)分別進行直接插入排序,然後依次縮減增量再排序

待整個序列中的元素基本有序(增量足夠小)時,再對全體元素進行一次!!!直接插入排序。因為直接插入排序在元素基本有序的情況下效率是很高的

實驗: n = 10的乙個陣列 49,38,65,97,26,13,27,49,55,4

第一次gap = 10 / 2 = 5

49 38 65 97 26 13 27 49 55 4

1a 1b

2a 2b

3a 3b 註解:數字相同為同一組,同一組用字母表示是該組的第幾個元素

4a 4b

5a 5b

第一次排序完成之後

13 27 49 55 4 49 38 65 97 26

第二次gap = 5 / 2 = 2

13 27 49 55 4 49 38 65 97 26

1a 1b 1c 1d 1e

2a 2b 2c 2d 2e

第二次排序完成之後

4 26 13 27 38 49 49 55 97 65

第三次gap = 2 / 2 = 1

4 26 13 27 38 49 49 55 97 65

1a 1b 1c 1d 1e 1f 1g 1h 1i 1j

第三次排序完成之後

4 13 26 27 38 49 49 55 65 97

*/void swap(int *,int *);

void shell_sort(int a,int n)

}if( k != j - gap )

a[p + gap] = temp;}}

} }}//優化上面變數太多,優化一下

void shell_sort2(int a,int n)

//else

//if( a[j] < a[j - gap] )

a[k + gap] = temp;}}

} }}void swap(int *a , int *b)

void print(int a,int n)

printf("\n");

}int main()

; shell_sort2(a,10);

print(a,10);

system("pause");

return 0;

}

面試 演算法排序(3)(希爾排序)

shell排序 嚴格來說基於插入排序的思想,又稱希爾排序或者縮小增量排序 流程 將有n 個元素的陣列分成n 2個數字序列,第1個資料和第n 2 1個資料為1對,第2個資料和第n 2 2個資料為一對 一次迴圈使每乙個序列隊排好順序 然後,再變為n 4個序列,再次排序 不斷重複上述過程,隨著序列減少最後...

排序演算法 希爾排序

如果乙個排序演算法,每次只把諸專案移動乙個位置,則它的平均執行時間至少要和n2成比例.因為在這個排序演算法執行的過程當中,每個記錄平均都必須遍歷n 3個位置,因此如果要對直接插入排序進行有效的,實質性的改進的話,就要有一種演算法,它可以使記錄做長距離的跳躍,而不是一步一步的挪動.希爾排序也是一種插入...

排序演算法 希爾排序

摘要 排序演算法有很多,最簡單的有氣泡排序和插入排序,這兩種方法都具有o n 2 的時間界.我們想要討論的是具有更好的時間界的排序演算法,比如希爾排序.1 希爾排序的思路是通過比較一定間距的元素來進行排序,最後再對所有相鄰元素進行一次插入排序.2 希爾排序最重要的引數是增量序列 h1,h2,ht 只...