成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

經(jīng)典四講貫通C++排序之二 希爾排序

開發(fā) 后端
經(jīng)典四講這四篇文章主要介紹C++數(shù)據(jù)結(jié)構(gòu)排序知識(shí),筆者把這四篇文章分為四個(gè)部分,分別介紹C++排序中插入排序、希爾排序、交換排序以及選擇排序。本文是這次系列文章的第二篇,主要介紹希爾排序。

  我們都知道C++排序方法中,有四種常用方法插入排序希爾排序交換排序以及選擇排序。上一篇文章,我們介紹了插入排序,今天我們介紹另一種排序方法——希爾排序。(本系列文章統(tǒng)一 測試程序)  

  希爾排序

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

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

  1. template <class T>  
  2. void ShellSort(T a[], int N, int& KCN, int& RMN)  
  3. {  
  4. KCN = 0; RMN = 0;  
  5. for (int gap = N/2; gap; gap = gap/2)  
  6. for (int i = gap; i < N; i++)  
  7. {  
  8. T temp = a[i]; RMN++;  
  9. for (int j = i; j >= gap && ++KCN && temp < a[j - gap]; j -= gap)  
  10. { a[j] = a[j - gap]; RMN++; }  
  11. a[j] = temp; RMN++;  
  12. }  

  測試結(jié)果:

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

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

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

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

【編輯推薦】

  1. 幾種常用的C#排序方法簡介
  2. 四種C#排序算法代碼示例
  3. 希爾排序算法的JAVA實(shí)現(xiàn)
  4. c++編程常用工具
  5. 給C++初學(xué)者的50個(gè)忠告
  6. c++最基礎(chǔ)的20條規(guī)則
  7. 深入剖析C/C++程序員應(yīng)聘常見面試題
  8. 程序員必看 c++筆試題匯總
責(zé)任編輯:韓亞珊 來源: 天極網(wǎng)
相關(guān)推薦

2011-04-11 14:52:18

選擇排序排序C++

2011-04-11 14:29:44

交換排序冒泡排序排序

2011-04-11 13:41:34

插入排序排序C++

2021-01-26 05:33:07

排序算法快速

2011-04-11 15:57:22

DFSBFSC++

2011-04-20 14:19:00

希爾排序

2011-04-11 16:19:56

C++

2023-03-06 08:10:52

數(shù)據(jù)結(jié)構(gòu)算法數(shù)據(jù)

2022-03-12 20:12:08

希爾排序數(shù)組插入排序

2011-04-11 16:32:28

路徑C++

2023-10-07 00:11:37

希爾排序算法

2021-01-19 07:02:26

算法數(shù)據(jù)結(jié)構(gòu)堆排序

2011-04-11 15:53:40

C++

2011-04-11 16:43:51

AOVAOE活動(dòng)網(wǎng)絡(luò)

2011-04-11 16:10:55

無向圖C++

2021-10-15 09:43:12

希爾排序復(fù)雜度

2021-01-21 05:22:36

排序算法選擇

2011-04-20 13:56:08

選擇排序

2010-02-06 16:16:01

C++冒泡排序

2009-09-08 17:20:01

C#排序算法
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 羞羞视频网站免费观看 | 久久6视频 | 欧美一级二级三级视频 | 国产久视频 | 欧美精品成人影院 | 亚洲免费视频一区二区 | 成人午夜视频在线观看 | 日韩欧美在线视频 | 99re超碰| 免费看啪啪网站 | www.亚洲区| www国产成人免费观看视频,深夜成人网 | 国产精品视频一区二区三区 | 欧美另类日韩 | 九七午夜剧场福利写真 | 国产男女视频网站 | 女同久久另类99精品国产 | 日韩精品一区二区三区在线观看 | 日韩成人一区 | 久久国产精品免费视频 | av一级久久 | 91久久精品| www.亚洲精品 | 一区二区三区免费 | 国产精品一码二码三码在线 | 91 在线| 国产一区二区精品在线观看 | 欧美午夜一区 | 久草视频在线播放 | 亚洲最大av网站 | 毛片久久久 | 欧美一区二区三区四区在线 | 精品国产乱码久久久久久老虎 | 天堂素人约啪 | 国产欧美精品一区二区三区 | 一区二区在线免费观看 | 一区二区三区免费观看 | 日韩免费一区 | 欧美综合一区 | 不卡av电影在线播放 | 久久久久久黄 |