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

經典四講貫通C++排序之四 選擇排序

開發 后端
經典四講這四篇文章主要介紹C++數據結構排序知識,筆者把這四篇文章分為四個部分,分別介紹C++排序中插入排序、希爾排序、交換排序以及選擇排序。本文是這次系列文章的最后一篇,主要介紹選擇排序。

  我們都知道C++排序方法中,有四種常用方法插入排序希爾排序交換排序以及選擇排序。這篇文章我們介紹選擇排序。(本系列文章統一 測試程序

  選擇排序

  基本思想是:每次選出第i小的記錄,放在第i個位置(i的起點是0,按此說法,第0小的記錄實際上就是最小的,有點別扭,不管這么多了)。當i=N-1時就排完了。

  直接選擇排序

  直選排序簡單的再現了選擇排序的基本思想,***次尋找最小元素的代價是O(n),如果不做某種特殊處理,每次都使用最簡單的尋找方法,自然的整個排序的時間復雜度就是O(n2)了。

  1. template <class T>  
  2. void SelectSort(T a[], int N, int& KCN, int& RMN)  
  3. {  
  4. KCN = 0; RMN = 0;  
  5. for (int i = 0; i < N; i++)  
  6. {  
  7. for (int j = i + 1, k = i; j < N; j++) if (++KCN && a[j] < a[k]) k = j;//select min  
  8. if (k != i) { swap(a[k], a[i]); RMN += 3; }  
  9. }  

  測試結果:

  1. Sort ascending N=10000 TimeSpared: 721ms  
  2. KCN=49995000 KCN/N=4999.5 KCN/N^2=0.49995 KCN/NlogN=376.25  
  3. RMN=0 RMN/N=0 RMN/N^2=0 RMN/NlogN=0  
  4. Sort randomness N=10000 TimeSpared: 711ms  
  5. KCN=49995000 KCN/N=4999.5 KCN/N^2=0.49995 KCN/NlogN=376.25  
  6. RMN=29955 RMN/N=2.9955 RMN/N^2=0.00029955 RMN/NlogN=0.225434  
  7. Sort descending N=10000 TimeSpared: 711ms  
  8. KCN=49995000 KCN/N=4999.5 KCN/N^2=0.49995 KCN/NlogN=376.25  
  9. RMN=15000 RMN/N=1.5 RMN/N^2=0.00015 RMN/NlogN=0.112886 

  可以看到KCN固定為n(n-1)/2。另外一件有趣的事是,RMN=0的正序花的時間居然比RMN接近3(n-1)的亂序還多。一是說明測試精度不夠,在我的機器上多次測試結果上下浮動10ms是常有的事;二是說明和KCN的n(n-1)/2相比,RMN的3(n-1)有些微不足道。

#p#

  錦標排序

  從直選排序看來,算法的瓶頸在于KCN,而實際上,對于后續的尋找最小值來說,時間復雜度可以降到O(logn)。最為直接的做法是采用錦標賽的辦法,將冠軍拿走之后,只要把冠軍打過的比賽重賽一遍,那么剩下的人中的“冠軍”就產生了,而重賽的次數就是競賽樹的深度。實際寫的時候,弄不好就會寫得很“蠢”,不只多余占用了大量內存,還會導致無用的判斷。我沒見過讓人滿意的例程(殷版上的實在太惡心了),自己又寫不出來漂亮的,也就不獻丑了(其實這是惰性的緣故,有了快排之后,大多數人都不會對其他內排感興趣,除了基數排序)。實在無聊的時候,不妨寫(或者改進)錦標排序來打發時間,^_^。

  堆排序

  錦標排序的附加儲存太多了,而高效的尋找***值或最小值(O(logn)),我們還有一種方法是堆。這里使用了***堆,用待排記錄的空間充當堆空間,將堆頂的記錄(目前***)和堆的***一個記錄交換,當堆逐漸縮小成1的時候,記錄就排序完成了。顯而易見的,時間復雜度為O(nlogn),并且沒有很糟的情況。

  1. template <class T>  
  2. void FilterDown(T a[], int i, int N, int& KCN, int& RMN)  
  3. {  
  4. int child = 2 * i + 1; T temp = a[i];  
  5. while (child < N)  
  6. {  
  7. if (child < N - 1 && a[child] < a[child+1]) child++;  
  8. if (++KCN && temp >= a[child]) break;//不需調整,結束調整  
  9. a[i] = a[child]; RMN++;  
  10. i = child; child = 2 * i + 1;  
  11. }  
  12. a[i] = temp; RMN++;  
  13. }  
  14. template <class T>  
  15. void HeapSort(T a[], int N, int& KCN, int& RMN)  
  16. {  
  17. int i;  
  18. for (i = (N - 2)/2; i >= 0; i--) FilterDown(a, i, N, KCN, RMN);//生成***堆  
  19. for (i = N - 1; i > 0; i--)  
  20. {  
  21. swap(a[0], a[i]); RMN += 3;  
  22. FilterDown(a, 0, i, KCN, RMN);  
  23. }  

  測試結果,直接測試的是N=100000:

  1. Sort ascending N=100000 TimeSpared: 110ms  
  2. KCN=1556441 KCN/N=15.5644 KCN/N^2=0.000155644KCN/NlogN=0.937071  
  3. RMN=2000851 RMN/N=20.0085 RMN/N^2=0.000200085RMN/NlogN=1.20463  
  4. Sort randomness N=100000 TimeSpared: 160ms  
  5. KCN=3047006 KCN/N=30.4701 KCN/N^2=0.000304701KCN/NlogN=1.83448  
  6. RMN=3898565 RMN/N=38.9857 RMN/N^2=0.000389857RMN/NlogN=2.34717  
  7. Sort descending N=100000 TimeSpared: 90ms  
  8. KCN=4510383 KCN/N=45.1038 KCN/N^2=0.000451038KCN/NlogN=2.71552  
  9. RMN=5745996 RMN/N=57.46 RMN/N^2=0.0005746 RMN/NlogN=3.45943 

  整體性能非常不錯,附加儲存1,還沒有很糟的情況,如果實在不放心快排的最壞情況,堆排確實是個好選擇。這里仍然出現了KCN、RMN多的反而消耗時間少的例子——誤差70ms是不可能的,看來CPU優化的作用還是非常明顯的(可能還和Cache有關)。

【編輯推薦】

  1. 幾種常用的C#排序方法簡介
  2. 四種C#排序算法代碼示例
  3. C#算法之選擇排序淺析
  4. c++編程常用工具
  5. 給C++初學者的50個忠告
  6. c++最基礎的20條規則
  7. 深入剖析C/C++程序員應聘常見面試題
  8. 程序員必看 c++筆試題匯總
責任編輯:韓亞珊 來源: 天極網
相關推薦

2011-04-11 14:21:43

希爾排序排序C++

2011-04-11 13:41:34

插入排序排序C++

2011-04-11 14:29:44

交換排序冒泡排序排序

2011-04-11 16:19:56

C++

2015-10-20 15:09:55

排序算法

2011-04-20 14:19:00

希爾排序

2021-01-19 07:02:26

算法數據結構堆排序

2009-08-11 09:19:52

C#選擇排序C#算法

2009-09-08 17:20:01

C#排序算法

2021-01-21 05:22:36

排序算法選擇

2011-04-11 16:32:28

路徑C++

2011-04-11 16:10:55

無向圖C++

2011-04-11 15:53:40

C++

2011-04-11 15:57:22

DFSBFSC++

2011-04-11 16:43:51

AOVAOE活動網絡

2019-10-30 08:53:46

JavaScript冒泡排序選擇排序

2011-07-14 22:52:27

C++typedef

2021-06-24 17:55:40

Python 開發編程語言

2011-04-20 13:56:08

選擇排序

2022-11-21 07:58:10

Java排序冒泡排序
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲人人 | 国产精品美女久久久久久久网站 | 国产成人jvid在线播放 | 日韩精品不卡 | 成人免费大片黄在线播放 | 久久久99国产精品免费 | 精品视频99| 欧美一区二区三区在线播放 | 精品三级在线观看 | 日韩欧美三级在线 | 视频在线一区二区 | 人人cao | 国产目拍亚洲精品99久久精品 | 欧美不卡一区二区 | 男女羞羞视频免费看 | 天天影视综合 | 亚洲精品中文在线观看 | 亚洲欧美激情网 | 亚洲国产成人在线视频 | 成人性视频免费网站 | 免费视频一区二区三区在线观看 | 亚洲第一在线视频 | 国产精品久久 | 国产午夜一级 | 99精品一区二区 | 欧美视频网 | 美女视频黄色的 | 中文精品视频 | 99久久婷婷 | 中文字幕一级毛片视频 | 97视频在线观看免费 | 三区四区在线观看 | 99久久精品一区二区成人 | 色吧综合网| 久国产视频 | 国产精品国产三级国产aⅴ中文 | 免费福利视频一区二区三区 | 精品国产欧美 | 精品久久影院 | 亚洲国产视频一区 | 精品国产乱码一区二区三 |