背景介紹:
是指利用堆這種數(shù)據(jù)結(jié)構(gòu)所設(shè)計的一種排序算法。堆積是一個近似完全二叉樹的結(jié)構(gòu),并同時滿足堆積的性質(zhì):即子結(jié)點的鍵值或索引總是小于(或者大于)它的父節(jié)點。算法規(guī)則:
堆是具有下列性質(zhì)的完全二叉樹:每個結(jié)點的值都大于或等于其左右孩子結(jié)點的值,稱為大頂堆;或者每個結(jié)點的值都小于或等于其左右孩子結(jié)點的值,稱為小頂堆。將待排序的序列構(gòu)造成一個大頂堆。此時,整個序列的最大值就是堆頂?shù)母?jié)點。將它移走(其實就是將其與堆數(shù)組的末尾元素交換,此時末尾元素就是最大值),然后將剩余的n-1個序列重新構(gòu)造成一個堆,這樣就會得到n個元素中的次最大值。如此反復(fù)執(zhí)行,就能得到一個有序序列了。-
代碼實現(xiàn)(Java版本)
/** * 堆排序 */ private static void heapSort(int[] arr) { // 將待排序的序列構(gòu)建成一個大頂堆 for (int i = arr.length / 2; i >= 0; i--){ heapAdjust(arr, i, arr.length); } // 逐步將每個最大值的根節(jié)點與末尾元素交換,并且再調(diào)整二叉樹,使其成為大頂堆 for (int i = arr.length - 1; i > 0; i--) { swap(arr, 0, i); // 將堆頂記錄和當(dāng)前未經(jīng)排序子序列的最后一個記錄交換 heapAdjust(arr, 0, i); // 交換之后,需要重新檢查堆是否符合大頂堆,不符合則要調(diào)整 } } /** * 構(gòu)建堆的過程 * @param arr 需要排序的數(shù)組 * @param i 需要構(gòu)建堆的根節(jié)點的序號 * @param n 數(shù)組的長度 */ private static void heapAdjust(int[] arr, int i, int n) { int child; int father; for (father = arr[i]; leftChild(i) < n; i = child) { child = leftChild(i); // 如果左子樹小于右子樹,則需要比較右子樹和父節(jié)點 if (child != n - 1 && arr[child] < arr[child + 1]) { child++; // 序號增1,指向右子樹 } // 如果父節(jié)點小于孩子結(jié)點,則需要交換 if (father < arr[child]) { arr[i] = arr[child]; } else { break; // 大頂堆結(jié)構(gòu)未被破壞,不需要調(diào)整 } } arr[i] = father; } // 獲取到左孩子結(jié)點 private static int leftChild(int i) { return 2 * i + 1; } // 交換元素位置 private static void swap(int[] arr, int index1, int index2) { int tmp = arr[index1]; arr[index1] = arr[index2]; arr[index2] = tmp; }
算法學(xué)習(xí):堆排序
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
- 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
- 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
- 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
- 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
- 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
- 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
推薦閱讀更多精彩內(nèi)容
- 排序算法是最基本最常用的算法,不同的排序算法在不同的場景或應(yīng)用中會有不同的表現(xiàn),我們需要對各種排序算法熟練才能將它...
- 概述 排序有內(nèi)部排序和外部排序,內(nèi)部排序是數(shù)據(jù)記錄在內(nèi)存中進(jìn)行排序,而外部排序是因排序的數(shù)據(jù)很大,一次不能容納全部...
- 概述:排序有內(nèi)部排序和外部排序,內(nèi)部排序是數(shù)據(jù)記錄在內(nèi)存中進(jìn)行排序,而外部排序是因排序的數(shù)據(jù)很大,一次不能容納全部...
- 女性進(jìn)入青春期,開始月經(jīng)來潮,性器官也開始逐漸發(fā)育完善,這個時期會發(fā)現(xiàn)一些之前存在的問題,也有月經(jīng)來潮后出現(xiàn)的新問...