C++深入淺出講解希爾排序算法的實現(xiàn)
插入排序分為兩種:直接插入排序&希爾排序
希爾排序
1.基本思想
希爾排序是在直接插入排序基礎(chǔ)上的優(yōu)化,屬于非常牛掰的一個排序。
核心思想:
- 先進行預(yù)排序,讓數(shù)組接近有序;
- 直接插入排序
預(yù)排序
預(yù)排序步驟:
分組排,假設(shè)gap==3,間隔為gap的為一組,然后分別使用插入排序的思想對這gap組數(shù)據(jù)進行排序
多組間隔為gap的預(yù)排序,gap由大變小,gap越大,大的數(shù)可以越快的到后面,小的數(shù)可以越快得到前面,gap越大,預(yù)排完越不接近有序,gap越小,預(yù)排完越接近有序,gap為1時就是直接插入排序
動圖演示:
預(yù)排序代碼:
for (int i = 0; i < gap; i++)//有g(shù)ap組需要排 { for (int j = i; j < n - gap; j += gap)//內(nèi)層循環(huán),先排紅,再排綠,最后排藍 //注意內(nèi)層循環(huán)的寫法 { //跟直接插入排序很像,不同的是需要使用gap int end = j; int tmp = a[end + gap]; while (end >= 0) { if (a[end] > tmp) { a[end + gap] = a[end]; end -= gap; } else { break; } } a[end + gap] = tmp; } }
這是最初的寫法,其實這個代碼是可以優(yōu)化的:
//預(yù)排序優(yōu)化 for (int i = 0; i < n - gap; i++) //把間隔為gap的多組數(shù)據(jù)同時排 //當(dāng)?shù)絥-gap-1的位置就終止了 { int end = i; int tmp = a[end + gap]; while (end >= 0) { if (a[end] > tmp) { a[end + gap] = a[end]; end -= gap; } else { break; } } a[end + gap] = tmp; }
2.算法實現(xiàn)
//希爾排序 void ShellSort(int* a, int n) { //一開始初始化gap為n int gap = n; while (gap > 1)//gap大于1都是預(yù)排序,gap==1時為直接插入排序 { //為保證gap最終結(jié)果為1,可以gap/=2,也可以是gap=gap/3+1; gap /= 2; //預(yù)排序優(yōu)化 for (int i = 0; i < n - gap; i++) //把間隔為gap的多組數(shù)據(jù)同時排 //當(dāng)?shù)絥-gap-1的位置就終止了 { int end = i; int tmp = a[end + gap]; while (end >= 0) { if (a[end] > tmp) { a[end + gap] = a[end]; end -= gap; } else { break; } } a[end + gap] = tmp; } } }
完整代碼:
3.時間復(fù)雜度
希爾排序的時間復(fù)雜度是:O(N*logN)
到此這篇關(guān)于C++深入淺出講解希爾排序算法的實現(xiàn)的文章就介紹到這了,更多相關(guān)C++希爾排序內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C/C++ winsock實現(xiàn)不同設(shè)備實時通訊的示例代碼
這篇文章主要為大家詳細介紹了C/C++如何利用winsock連接實現(xiàn)不同設(shè)備實時通訊,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-09-09