亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

八大排序算法詳解——堆排序

2019-11-10 17:38:52
字體:
來源:轉載
供稿:網友

基本思想

堆的定義

n個關鍵字序列kl,k2,…,kn稱為堆,當且僅當該序列滿足如下性質之一(簡稱堆性質):

ki≤k2i且ki≤k2i+1 或ki≥k2i且ki≥k2i+1(1≤i≤FLOOR(n/2))

若將此序列所存儲的向量R[1..n]看做是一棵完全二叉樹的存儲結構,則堆實質上是滿足如下性質的完全二叉樹:樹中任一非葉結點的關鍵字均不大于(或不小于)其左右孩子(若 存在)結點的關鍵字。

小根堆:根結點(亦稱為堆頂)的關鍵字是堆里所有結點關鍵字中最小的。大根堆:根結點(亦稱為堆頂)的關鍵字是堆里所有結點關鍵字中最大的。

我們可以選擇大根堆或者小根堆中的任意一個來進行排序。

排序思想

用大根堆排序的基本思想:

先將初始文件R[1..n]建成一個大根堆,此堆為初始的無序區。再將關鍵字最大的記錄R[1](即堆頂)和無序區的最后一個記錄R[n]交換,由此得 到新的無序區R[1..n-1]和有序區R[n],且滿足R[1..n-1].keys≤R[n].key。由于交換后新的根R[1]可能違反堆性質,故應將當前無序區R[1..n-1]調整為堆。 然后再次將R[1..n-1]中關鍵字最大的記錄R[1]和該區間的最后一個記錄R[n-1]交換,由 此得到新的無序區R[1..n-2]和有序區R[n-1..n],且仍滿足關系 R[1..n-2].keys≤R[n-1..n].keys,同樣要將R[1..n-2]調整為堆。

算法實現

堆排序算法,java實現,代碼如下所示:

public abstract class Sorter { public abstract void sort(int[] array); } public class HeapSorter extends Sorter { public void sort(int[] array) { heapSort(array); } /** * <p>堆排序方法 * <p>基于大根堆的堆排序方法 */ PRivate void heapSort(int[] array) { Integer tmp; // 用于交換的暫存單元 buildHeap(array); // 執行初始建堆,并調整 for (int i = 0; i < array.length; i++) { // 交換堆頂元素array[0]和堆中最后一個元素array[array.length-1-i] tmp = array[0]; array[0] = array[array.length - 1 - i]; array[array.length - 1 - i] = tmp; // 每次交換堆頂元素和堆中最后一個元素之后,都要對堆進行調整 adjustHeap(array, 0, array.length - 1 - i); } } /** * 建堆方法 * 調整堆中0~array.length/2個結點,保持堆的性質 * */ private void buildHeap(int[] array) { // 求出當前堆中最后一個存在孩子結點的索引 int pos = (array.length - 1) / 2; // 從該結點結點開始,執行建堆操作 for (int i = pos; i >= 0; i--) { adjustHeap(array, i, array.length); // 在建堆過程中,及時調整堆中索引為i的結點 } } /** * <p> * 調整堆的方法 * * @param s 待調整結點的索引 * @param m 待調整堆的結點的數量(亦即:排除葉子結點) */ private void adjustHeap(int[] array, int s, int m) { Integer tmp = array[s]; // 當前待調整的結點 int i = 2 * s + 1; // 當前待調整結點的左孩子結點的索引(i+1為當前調整結點的右孩子結點的索引) while (i < m) { if (i + 1 < m && array[i] < array[i + 1]) { // 如果右孩子大于左孩子(找到比當前待調整結點大的孩子結點) i = i + 1; } if (array[s] < array[i]) { array[s] = array[i]; // 孩子結點大于當前待調整結點,將孩子結點放到當前待調整結點的位置上 s = i; // 重新設置待調整的下一個結點的索引 i = 2 * s + 1; } else { // 如果當前待調整結點大于它的左右孩子,則不需要調整,直接退出 break; } array[s] = tmp; // 當前待調整的結點放到比其大的孩子結點位置上 } } }

排序過程

假設待排序數組為array = {94,12,34,76,26,9,0,37,55,76,37,5,68,83,90,37,12,65,76,49},數組大小為20。

第一步:初始建堆首先執行的初始建堆(在建堆的過程中需要調整堆)。過程如下:

求出當前堆中最后一個存在孩子結點的索引

這里,把數組array看做是一棵完全二叉樹,這樣數組每個索引位置上的元素都對應到二叉樹中的結點,如圖所示:heapsort其中需要在這棵樹中找到最后一個有孩子最大的一個結點的索引:pos = (array.length-1)/2 = (20-1)/2 = 9也就是索引為9的array[9] = 76,由后至前層次遍歷,從array[9]一直到array[0],對初始堆進行調整。

對初始堆進行調整調整結點array[9] = 76:

先比較array[9] = 76的左右孩子:s = 9,i = 2*s+1 = 2*9 + 1 = 19,而i+1 = 19 + 1 = 20 > m = array.length-1 = 20 -1 = 19(array[9] = 76沒有右孩子),只需要將array[9] = 76與array[i] = array[19] = 49比較,因為array[9] = 76>array[i] = array[19] = 49,則不需要交換array[9] = 76與array[i] = array[19] = 49,繼續對下一個結點(也就是array[8] = 55)進行調整;

調整結點array[8] = 55:

先比較array[8] = 55的左右孩子:s = 8,i = 2*s+1 = 2*8 + 1 = 17,,而i+1 = 17 + 1 = 18 < m = array.length-1 = 20-1 = 19(array[8] = 55存在右孩子),左孩子array[i] = array[17] = 65小于右孩子array[i+1] = array[18] = 76,只需要將array[8] = 76與右孩子array[i+1] = array[18] = 76比較,因為array[8] = 55<array[i+1] = array[18] = 76,則需要交換array[8] = 55與array[i+1] = array[18] = 76,交換后如圖所示:heapsort-1繼續對下一個結點(也就是array[8] = 55)進行調整;

調整結點array[7] = 37:

顯然,不需要交換;

調整結點array[6] = 0:

調整結果如圖所示:heapsort-2

調整結點array[5] = 9:

調整結果如圖所示:heapsort-3

調整結點array[4] = 26:

調整結果如圖所示:heapsort-4

調整結點array[3] = 76:

顯然,不需要交換。

調整結點array[2] = 34:

調整結果如圖所示:heapsort-5

調整結點array[1] = 12:

調整結果如圖所示:heapsort-6

調整結點array[0] = 94:

顯然,不需要交換。

至此,對初始堆的調整完成。

第二步:第一次交換將堆頂元素與最后一個元素交換,即array[0] = 94與最后一個元素array[19] = 49交換,如圖所示:heapsort-7此時,數組為:array = {49,76,90,12,76,68,34,37,76,26,37,5,9,83,0,37,12,65,55,94}數組中最大的元素被交換到了數組的末尾,也就是array[19] = 94是最終排好序的固定位置。

第三步:調整堆過程同前面類似。……最后經過堆排序得到有序的數組。

算法分析

時間復雜度

堆排序的時間,主要由建立初始堆和反復重建堆這兩部分的時間開銷構成。堆排序的最壞時間復雜度為O(nlgn)。堆排序的平均性能較接近于最壞性能。由于建初始堆所需的比較次數較多,所以堆排序不適宜于記錄數較少的文件。

空間復雜度

堆排序過程中,需要調整堆,交換待排序記錄需要一個臨時存儲單元,所以空間復雜度為O(1)。

排序穩定性

堆排序是就地排序,它是不穩定的排序方法。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久99精品久久久久久琪琪| 亚洲欧美制服丝袜| 久久国产色av| 欧美亚洲日本黄色| 懂色av影视一区二区三区| 国产精品免费久久久| 国产精品看片资源| 日韩av影院在线观看| 欧美裸体xxxx极品少妇| 国产精品露脸自拍| 久久久久久久久久久av| 青草青草久热精品视频在线观看| 一本色道久久综合亚洲精品小说| 日韩美女主播视频| 成人羞羞国产免费| 国产午夜精品全部视频播放| 亚洲视频999| 欧美激情喷水视频| 欧美中文字幕精品| 欧亚精品中文字幕| 91亚洲一区精品| 亚洲午夜久久久影院| 97在线视频免费看| 日韩国产欧美区| 欧美成在线视频| 欧美电影免费观看网站| 亚洲综合在线中文字幕| 久久91精品国产91久久跳| 亚洲女成人图区| 国产精品视频免费观看www| 亚洲成av人影院在线观看| 欧美激情在线狂野欧美精品| 中文字幕日韩综合av| 91久久久在线| 亚洲成av人乱码色午夜| 91精品国产综合久久香蕉922| 欧美在线视频网站| 国产手机视频精品| 欧美在线激情视频| 日韩av电影手机在线观看| 亚洲第一精品电影| 国产99久久精品一区二区永久免费| 亚洲bt欧美bt日本bt| 欧美精品电影免费在线观看| 91夜夜揉人人捏人人添红杏| 久久国内精品一国内精品| 国产91|九色| 精品国产一区二区三区久久狼黑人| 亚洲美女黄色片| 欧美精品在线免费观看| 精品夜色国产国偷在线| 日韩欧美在线视频| 国产精品aaa| 91九色精品视频| 久久国产精品久久久久久久久久| 久久激情五月丁香伊人| 日本韩国欧美精品大片卡二| 亚洲欧美日韩天堂一区二区| 尤物精品国产第一福利三区| 欧美黑人巨大精品一区二区| 久久精品影视伊人网| 91精品久久久久久久久久另类| 成人免费淫片aa视频免费| 国产精品无av码在线观看| 亚洲桃花岛网站| 欧美日韩成人在线播放| 欧美极品美女视频网站在线观看免费| 久久免费国产精品1| 日韩麻豆第一页| 成人黄色免费片| 日韩在线一区二区三区免费视频| 亚洲免费视频观看| 亚洲色图狂野欧美| 国产精品久久久久久久av大片| 狠狠色狠狠色综合日日五| 91免费在线视频网站| 欧美日韩免费网站| 色综合久久88| 欧美日韩国产一区二区| 91大神福利视频在线| 亚洲免费视频在线观看| 亚洲人成电影在线| 久99九色视频在线观看| 在线观看久久久久久| 国产精品视频网址| 欧美性xxxx极品高清hd直播| 欧美在线激情视频| 91国产精品视频在线| 国产免费一区二区三区在线能观看| 欧美福利视频在线观看| 亚洲欧美在线一区二区| 国产精品高潮在线| 欧美综合一区第一页| www国产亚洲精品久久网站| 国产精品一区二区久久国产| 国产欧美日韩高清| 国产91在线播放精品91| 欧美中文字幕精品| 正在播放国产一区| 日日噜噜噜夜夜爽亚洲精品| 国产精品一区二区三区毛片淫片| 久久久精品久久久久| 欧美裸身视频免费观看| 国产网站欧美日韩免费精品在线观看| 亚洲第一页自拍| 国产精品一区二区久久久久| 国产黑人绿帽在线第一区| 欧美xxxx综合视频| 日本国产欧美一区二区三区| 日韩欧美福利视频| 91av视频导航| 国产偷国产偷亚洲清高网站| 亚洲一区二区福利| 日韩av资源在线播放| 国语自产偷拍精品视频偷| 91免费视频国产| 国语自产在线不卡| 国产91精品高潮白浆喷水| 久久精品久久久久| 国产精品久久久久99| 国产成人在线一区| 日本乱人伦a精品| 97视频免费在线看| 日韩在线视频免费观看| 国产精品第一第二| 福利视频一区二区| 日韩精品中文字幕在线播放| 亚洲va欧美va国产综合久久| 欧美性猛交xxxx乱大交3| 日韩精品中文字幕在线播放| 日韩视频中文字幕| 91福利视频在线观看| 一区二区亚洲欧洲国产日韩| 亚洲一区二区三区在线视频| 91色琪琪电影亚洲精品久久| 国产亚洲欧洲在线| 色先锋资源久久综合5566| 亚洲国产欧美一区二区三区同亚洲| 欧美一级在线亚洲天堂| 亚洲影视中文字幕| 国产精品久久久久国产a级| 欧美性视频在线| 久久九九亚洲综合| 精品亚洲aⅴ在线观看| 日韩中文在线不卡| 国产精品久久久久久久久久久久久久| 国产精品ⅴa在线观看h| 高清一区二区三区日本久| 精品无人国产偷自产在线| 欧美精品在线免费播放| 日韩电影中文字幕av| 中文字幕在线观看亚洲| 成人黄色中文字幕| 亚洲精品美女在线观看| 97超级碰碰碰久久久| 日韩经典中文字幕在线观看| 在线观看日韩欧美| 日韩国产高清视频在线| 色偷偷噜噜噜亚洲男人的天堂| 国产自产女人91一区在线观看| 亚洲第一偷拍网| 欧美激情久久久| 欧美另类极品videosbest最新版本| 欧美理论片在线观看|