青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

羅朝輝(飄飄白云)

關注嵌入式操作系統(tǒng),移動平臺,圖形開發(fā)。-->加微博 ^_^

  C++博客 :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
  85 隨筆 :: 0 文章 :: 169 評論 :: 0 Trackbacks

排序算法之選擇排序   

羅朝輝(http://m.shnenglu.com/kesalin

轉載請注明出處

排序是數據處理中經常使用的一種重要運算,在計算機及其應用系統(tǒng)中,花費在排序上的時間在系統(tǒng)運行時間中占有很大比重,其重要性無需多言。下文將介紹常用的如下排序方法,對它們進行簡單的分析和比較,并提供 C 語言實現。


所謂排序,就是要將一堆記錄,使之按關鍵字遞增(或遞減)次序排列起來。根據排序所采用的策略,可以分為如下五種:

1、插入排序(直接插入排序、希爾排序)

2、交換排序(冒泡排序、快速排序)

3、選擇排序(直接選擇排序、堆排序)

4、歸并排序;

5、桶排序(桶排序,基數排序);


---------------------------------------------------------------------------------


前面講了插入,交換排序,下面接著來講選擇排序。


選擇排序(Selection Sort)的基本思想是:每一趟從待排序的記錄中選出關鍵字最小的記錄,順序放在已排好序的子文件的最后,直到全部記錄排序完畢。


常用的選擇排序方法有直接選擇排序和堆排序。


直接選擇排序

基本思想:將待排序記錄分成有序區(qū)和無序區(qū),初始狀態(tài)下有序區(qū)位空,無序區(qū)為整個待排序記錄。每一趟選擇排序就是在無序區(qū)中選擇最小(或最大)的記錄,插入到有序區(qū)的最后。如此循環(huán)直到無序區(qū)為空,完成排序。


代碼實現

// 直接選擇排序 // void select_sort(int* array, int length) { assert(array && length >= 0); int i, j, k, temp; for (i = 1; i < length; ++i) { k = i; for (j = i + 1; j < length; ++j) { if (array[j] < array[k]) { k = j; } } if (k != i) { temp = array[i]; array[i] = array[k]; array[k] = temp; } } }


時間復雜度分析:

無論待排序記錄的初始狀態(tài)如何,在第 i 趟排序中選出最小關鍵字的記錄,需做 n - i 次比較,因此,總的比較次數為: n * (n - 1) / 2 = 0(n ^ 2),當待排序記錄的初始狀態(tài)為正序時,移動次數為 0;當初始狀態(tài)為反序時,每趟排序均要執(zhí)行交換操作,總的移動次數取最大值 3 * (n-1)。所以,直接選擇排序的平均時間復雜度為 0(n ^ 2)。


空間復雜度:

很明顯,0(1)。


補充:

直接選擇排序是一個就地排序,且是非穩(wěn)定排序。


堆排序

堆的定義:滿足如下約束的 n 個關鍵字序列 Kl,K2,…,K稱為堆,1 ≤ i ≤ n/2,
   (1) k≤ K2i 且 k≤ K2i+1 (小根堆)   或

(2) K≥ K2i 且 k≥ K2i+1 (大根堆)


從定義來看,堆實質上是滿足如下性質的完全二叉樹:樹中任一非葉結點的關鍵字均不大于(或不小于)其左右孩子(若存在的話)結點的關鍵字。堆排序就是充分利用堆這種堆頂記錄要么是最大的要么是最小的有序性質,每次在堆中選擇最大或最小關鍵字完成排序。堆排序也是選擇排序的一種,它比直接選擇排序平均效率要高,因為直接選擇排序,每次比較之后并沒有對比較結果進行保存,導致可能存在重復的比較,而堆則利用其堆性質將比較結果保存在堆中了(非葉子節(jié)點的左邊孩子一定不大于或不小于比右邊的孩子)。


堆排序的關鍵就在于將待排序記錄的建立成堆,建好堆之后,將無序區(qū)的堆頂記錄(總是無序區(qū)的最大或最小)和無序區(qū)最后一個記錄交換,交換之后,無序區(qū)的最后一個記錄變成有序區(qū)的第一個記錄,而無序區(qū)新的的堆頂記錄不一定滿足堆性質了,因而需要將無序區(qū)調整而堆。如此循環(huán),直到無序區(qū)為空,結束排序。


所以堆排序的主要步驟就分三步:

1,建立初始堆;

2,將無序的堆頂記錄與最后一個記錄交換,縮小無序區(qū);

3,將交換之后的無序區(qū)調整為堆,重復步驟 2。


代碼實現:

// 篩選法調整堆,除 [low] 之外,[low] 的兩個孩子均已是大根堆 void adjust_heap(int* heap, int low, int high) { assert(heap); #if 1 // 循環(huán)實現 int i = low; int j = 2 * i; int temp = heap[i]; while (j <= high) { // 若有兩個孩子,j 為孩子中大的那個的下標 if (j < high && heap[j] < heap[j + 1]) { j = j + 1; } // 已是堆 if (temp >= heap[j]) { break; } // 繼續(xù)篩選 else { heap[i] = heap[j]; i = j; j = 2 * i; } } heap[i] = temp; #else // 遞歸實現 int i = low; int j = 2 * i; int temp = heap[i]; if (j >= high) { return; } // 若有兩個孩子,j 為孩子中大的那個的下標 if (j < high && heap[j + 1] > heap[j]) { j = j + 1; } // 已經為堆,無需調整 if (heap[low] >= heap[j]) { return; } heap[i] = heap[j]; heap[j] = temp; // 調整之后,[j, high] 可能不滿足堆了,需繼續(xù)調整 adjust_heap(heap, j, high); #endif } // 只有一個結點的樹是堆,而在完全二叉樹中,所有序號 i > n/2 的結點都是葉子, // 因此以這些結點為根的子樹均已是堆。這樣,我們只需依次將以序號為 // n/2, n/2 - 1, …, 0 的結點作為根的子樹都調整為堆即可。 void build_heap(int* heap, int length) { assert(heap && length >= 0); int i; for(i = length / 2; i >= 0; --i) { adjust_heap(heap, i, length - 1); } } // 堆排序 // void heap_sort(int* array, int length) { assert(array && length >= 0); if (length <= 1) { return; } int i, temp; // 將 [0, length - 1] 建成初始堆 build_heap(array, length); // 對當前無序區(qū) [0, i - 1] 進行堆排序,共做 length - 1 趟。 for(i = length - 1; i > 0; --i) { // 將堆頂和堆中最后一個記錄交換 temp = array[0]; array[0] = array[i]; array[i]= temp; // 將 [0, i - 1] 重新調整為堆,僅有 [0] 可能違反堆性質 adjust_heap(array, 0, i - 1); } }

時間復雜度分析:

 

堆排序的時間開銷主要由建立初始堆和反復調整堆這兩部分的時間開銷構成,你可以想象成二叉樹的情形。堆排序的平均時間復雜度為O(nlgn)。


空間復雜度分析:

很明顯,為 0(1)。


補充:

堆排序是不穩(wěn)定的就地排序。


=======================================================================================

測試:

在前文《排序算法之插入排序》測試代碼的基礎上添加兩行代碼即可:

SortFucntionInfo sort_function_list[] = {

{"直接選擇排序", select_sort},

{"堆排序", heap_sort},

{"", NULL}

};


運行結果:

=== 直接選擇排序 ===

 original: 65 32 49 10 8 72 27 42 18 58 91

   sorted: 65 8 10 18 27 32 42 49 58 72 91


 original: 10 9 8 7 6 5 4 3 2 1 0

   sorted: 10 0 1 2 3 4 5 6 7 8 9



=== 堆排序 ===

 original: 65 32 49 10 8 72 27 42 18 58 91

   sorted: 8 10 18 27 32 42 49 58 65 72 91


 original: 10 9 8 7 6 5 4 3 2 1 0

   sorted: 0 1 2 3 4 5 6 7 8 9 10

 

posted on 2011-03-09 21:37 羅朝輝 閱讀(1488) 評論(0)  編輯 收藏 引用 所屬分類: Algorithms
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            久久婷婷久久| 亚洲精品国久久99热| 久久亚洲综合色| 性一交一乱一区二区洋洋av| 午夜精品视频| 久久久久久欧美| 美女日韩欧美| 一区二区高清| 国产女主播视频一区二区| 国产精品美女www爽爽爽| 国产欧美日韩在线视频| 一区在线视频观看| 亚洲伦理在线| 欧美一区二区三区久久精品| 久久资源av| 亚洲日本欧美日韩高观看| 日韩午夜黄色| 久久国产一区二区| 欧美日韩一区在线观看| 狠狠综合久久| 亚洲资源在线观看| 免费欧美日韩| 亚洲一区尤物| 免费观看成人鲁鲁鲁鲁鲁视频| 欧美视频在线观看 亚洲欧| 黄色日韩在线| 亚洲欧美日韩视频一区| 亚洲福利视频在线| 羞羞答答国产精品www一本| 男人插女人欧美| 国产欧美一区二区三区沐欲 | 国产精品入口尤物| 亚洲国内精品在线| 久久精品国产视频| 中文欧美字幕免费| 欧美激情亚洲| 亚洲黄网站在线观看| 久久精品亚洲一区二区| 一本色道久久88精品综合| 蜜桃久久精品乱码一区二区| 国产麻豆日韩欧美久久| 亚洲视频www| 亚洲电影免费在线观看| 久久成人在线| 国产亚洲亚洲| 久久精品国产77777蜜臀| 一本一道久久综合狠狠老精东影业 | 国产一区再线| 欧美亚洲专区| 亚洲午夜高清视频| 国产精品成人v| 亚洲一区二区三区精品在线观看| 欧美激情视频一区二区三区在线播放 | 久久久999成人| 亚洲字幕在线观看| 久久香蕉国产线看观看av| 亚洲欧美精品在线观看| 久久综合网络一区二区| 在线欧美日韩精品| 久久人人97超碰国产公开结果| 亚洲欧洲av一区二区| 国产精品视频精品视频| 亚洲欧美日韩国产成人| 亚洲一区二区三区激情| 国产精品热久久久久夜色精品三区| 亚洲一区二区高清| 亚洲一区在线免费观看| 国产一区二区按摩在线观看| 久久综合国产精品| 久久香蕉国产线看观看av| 91久久中文| 亚洲免费观看高清完整版在线观看熊 | 欧美午夜精品久久久久久孕妇 | 欧美freesex交免费视频| 亚洲乱码国产乱码精品精天堂| 亚洲日本成人在线观看| 国产精品日韩一区二区| 久久er99精品| 欧美暴力喷水在线| 亚洲欧美国产日韩中文字幕| 亚洲男人天堂2024| 一区二区亚洲精品| 亚洲伦理自拍| 国产综合精品一区| 最新成人在线| 国产区精品视频| 亚洲国产精品成人一区二区| 欧美视频观看一区| 狂野欧美激情性xxxx| 嫩草国产精品入口| 亚洲欧美日韩一区二区三区在线观看 | 久久亚洲图片| 亚洲一区国产一区| 久久一区二区三区四区| 亚洲午夜精品福利| 久久一区二区精品| 欧美一区二区黄| 欧美激情亚洲视频| 久色成人在线| 国产欧美日韩伦理| 亚洲精品一区二区三| 狠狠入ady亚洲精品经典电影| 亚洲免费电影在线| 亚洲激情亚洲| 久久久久久久久蜜桃| 亚洲精品国产品国语在线app| 国产精品一区二区在线| 亚洲精品在线观看视频| 在线成人激情| 亚洲一区影音先锋| 亚洲视频久久| 欧美精品在线免费播放| 免费看黄裸体一级大秀欧美| 国产欧美一区二区三区另类精品 | 久久高清国产| 亚洲欧美日韩综合一区| 欧美高清视频| 美女视频一区免费观看| 国产区在线观看成人精品| 一区二区三区免费看| 99ri日韩精品视频| 免费观看成人| 欧美国产日本韩| 在线视频国产日韩| 久久精品夜色噜噜亚洲aⅴ| 欧美淫片网站| 国产日韩一区欧美| 欧美在线你懂的| 久久青草福利网站| 狠狠干成人综合网| 久久久精彩视频| 麻豆精品视频在线观看视频| 国产一区在线播放| 久久精品国产欧美激情| 久久久噜噜噜久久中文字幕色伊伊 | 黑人一区二区| 久久久精品动漫| 欧美国产极速在线| 亚洲国产天堂久久综合网| 欧美成人免费全部| 亚洲人精品午夜在线观看| 一区二区欧美在线观看| 欧美日韩国产在线观看| 99国产一区| 欧美一区二区视频在线| 国产一区二区精品在线观看| 久久精品中文字幕一区二区三区| 久久亚洲精品中文字幕冲田杏梨| 伊人狠狠色j香婷婷综合| 美女在线一区二区| 日韩视频永久免费| 欧美一区三区三区高中清蜜桃| 国产亚洲精品7777| 免费观看成人| 一区二区三区黄色| 久久三级福利| 一本一本久久| 国产欧美日韩另类一区| 免费成人网www| 99香蕉国产精品偷在线观看| 欧美一级大片在线免费观看| 黄色亚洲免费| 欧美久色视频| 欧美在线观看一区二区| 欧美激情精品久久久六区热门 | 欧美大片18| 99视频热这里只有精品免费| 国产精品jizz在线观看美国| 欧美在线视频观看| 亚洲人在线视频| 久久久久久夜| 亚洲一区二区在线免费观看视频| 国产欧美日韩专区发布| 欧美.www| 欧美主播一区二区三区美女 久久精品人 | 国产亚洲一区精品| 欧美黑人一区二区三区| 亚洲欧美在线另类| 最新高清无码专区| 久久先锋影音av| 午夜久久久久久| 亚洲美女啪啪| 亚洲第一主播视频| 国产视频一区在线观看一区免费| 欧美99在线视频观看| 香蕉久久一区二区不卡无毒影院 | 亚洲黄网站黄| 国内精品久久久久国产盗摄免费观看完整版 | 久久一区欧美| 性一交一乱一区二区洋洋av| 亚洲精品一区在线观看香蕉| 久久久蜜臀国产一区二区| 亚洲综合精品自拍| 日韩亚洲欧美一区| 亚洲国产一区二区精品专区| 精品二区久久| 极品少妇一区二区三区精品视频| 国产精品视频福利| 国产精品欧美一区二区三区奶水| 欧美日韩免费高清一区色橹橹|