溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C++希爾排序是什么

發布時間:2021-11-29 15:39:03 來源:億速云 閱讀:142 作者:iii 欄目:編程語言

本篇內容介紹了“C++希爾排序是什么”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

希爾排序

前面的算法的平均效率都不怎么好,但我們注意到直插排序在關鍵碼基本有序的情況下,效率是***的,并且,在關鍵碼的數量很少的時候,n和n2的差距也不是那么的明顯?;谝陨系氖聦?,D.L.Shell在1959年(老古董了)提出了縮小增量排序,基本思想是:取一個間隔(gap),將序列分成若干的子序列,對每個子序列進行直插排序;然后逐漸縮小間隔,重復以上過程,直到間隔為1。在開始的時候,每個子序列里關鍵碼很少,直插的效率很高;隨著間隔的縮小,子序列的關鍵碼越來越多,但是在前面的排序基礎上,關鍵碼已經基本有序,直插的效率依然很高。

希爾排序的時間復雜度不好估量,gap的選取也沒有定論,gap=[gap/2]的程序是***寫的,至于為什么,寫寫就知道了。

template <class T>  void ShellSort(T a[], int N, int& KCN, int& RMN)  {  KCN = 0; RMN = 0;  for (int gap = N/2; gap; gap = gap/2)  for (int i = gap; i < N; i++)  {  T temp = a[i]; RMN++;  for (int j = i; j >= gap && ++KCN && temp < a[j - gap]; j -= gap)  { a[j] = a[j - gap]; RMN++; }  a[j] = temp; RMN++;  }  }

測試結果:

Sort ascending N=10000 TimeSpared: 0ms  KCN=120005 KCN/N=12.0005 KCN/N^2=0.00120005 KCN/NlogN=0.903128  RMN=240010 RMN/N=24.001 RMN/N^2=0.0024001 RMN/NlogN=1.80626  Sort randomness N=10000 TimeSpared: 10ms  KCN=258935 KCN/N=25.8935 KCN/N^2=0.00258935 KCN/NlogN=1.94868  RMN=383849 RMN/N=38.3849 RMN/N^2=0.00383849 RMN/NlogN=2.88875  Sort descending N=10000 TimeSpared: 10ms  KCN=172578 KCN/N=17.2578 KCN/N^2=0.00172578 KCN/NlogN=1.29878  RMN=302570 RMN/N=30.257 RMN/N^2=0.0030257 RMN/NlogN=2.27707

注意到這時的測試結果很不準確了,10000個整數的排序已經測試不出什么來了(估計新機器都是0ms,我這里也有個別的時候全是0)。因此,下面用100000個整數的排序重新測試了一次:

Sort ascending N=100000 TimeSpared: 140ms  KCN=1500006 KCN/N=15.0001 KCN/N^2=0.000150001KCN/NlogN=0.903094  RMN=3000012 RMN/N=30.0001 RMN/N^2=0.000300001RMN/NlogN=1.80619  Sort randomness N=100000 TimeSpared: 230ms  KCN=4041917 KCN/N=40.4192 KCN/N^2=0.000404192KCN/NlogN=2.43348  RMN=5598883 RMN/N=55.9888 RMN/N^2=0.000559888RMN/NlogN=3.37086  Sort descending N=100000 TimeSpared: 151ms  KCN=2244585 KCN/N=22.4459 KCN/N^2=0.000224459KCN/NlogN=1.35137  RMN=3844572 RMN/N=38.4457 RMN/N^2=0.000384457RMN/NlogN=2.31466

這個結果表明,希爾排序幾乎沒有最壞情況,無論是正序、逆序、亂序,所用時間都不是很多,附加儲存是O(1),的確非常不錯。在沒搞清楚快速排序、堆排序之前,它的確是個很好的選擇,我當年一直用它。

“C++希爾排序是什么”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

c++
AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女