演算法(第四版)學習筆記之java實現堆排序

來源:互聯網
上載者:User

標籤:堆排序   java   排序演算法   

繼上一篇實現基於堆的優先隊列後,這次將利用上一次完成的基於堆的能夠重複刪除最大元素操作的優先隊列來實現一種經典而優雅的排序演算法,稱之為堆排序。

堆排序可分為兩個階段:

1.構建堆:在堆的構建過程中,我們將原始數組重新組織安排進一個堆中;

2.下沉排序:從堆中按遞減順序取出所有元素並得到排序結果

具體的思想在下面的代碼中有較為詳細的注釋:

/** *  * @author seabear * */public class HeapSort {/** * 1.構造大根堆:與上一篇基於堆的優先隊列相似,將原始數組重新組織成一個基於堆的擁有重複刪除最大元素操作的優先隊列; * 2.下沉排序:根據構造出來的大根堆,很容易將堆中的最大元素刪除,然後放入堆縮小後數組中空出的位置。 * @param a */public static void sort(Comparable[] a){int len = a.length-1;//構造大根堆//跳過只有一個結點的堆即大小為1的堆,從數組的中間開始掃描,調用sink()方法,層層遞減,最後在1位置上調用sink()方法後結束。//此次掃描目的是構造一個堆有序的數組並使最大元素位於數組的開頭(次大的元素在附近)for(int k = len / 2; k >= 1; k--){sink(a,k,len);show(a);}System.out.println("下沉開始");//下沉排序//1.每次排序都先將最大的元素與最後一個元素交換位置,接著縮小數組,對除去最後一個元素的堆進行下沉排序//2.對縮小後的數組進行下沉排序,若數組長度大於1,則跳轉到第一步繼續執行while(len > 1){exch(a,1,len--);sink(a,1,len);show(a);}}//下沉排序private static void sink(Comparable[] a,int i,int len){while(i*2 <= len){int j = i * 2;if(j < len && less(a[j],a[j+1])){j++;}if(!less(a[i],a[j])){break;}exch(a,i,j);i = j;}}private static boolean less(Comparable v,Comparable w){return v.compareTo(w) < 0;}private static void exch(Comparable[] v,int i, int j){Comparable temp = v[i];v[i] = v[j];v[j] = temp;}public static void show(Comparable[] a){for(int i = 1; i < a.length; i++){System.out.print(a[i] + " ");}System.out.println();}public static void main(String[] args){int N = 12;Integer[] a = new Integer[N];for(int i = 1; i <= N-1; i++){a[i] = (int)(Math.random() * 10 + 1);}show(a);sort(a);show(a);}}


堆排序在排序複雜性的研究中有著重要的地位,因為它是我們所知的唯一能夠同時最優地利用空間和時間的方法,即使在最壞的情況下,它也能保證使用~2NlgN次比較和恒定的額外空間。常用於嵌入式系統或低成本的行動裝置中(空間十分緊缺的系統);但現代系統的許多應用很少使用它,,因為它無法利用緩衝。數組元素很少和相鄰的其他元素進行比較,因此緩衝未命中的次數要遠高於大多數比較都在相鄰元素間進行的演算法,例如快速排序、歸併排序,甚至是希爾排序。另一方面,用堆實現的優先隊列在現代應用程式中越來越重要,因為它能在插入操作和刪除最大元素操作混合的動態情境中保證對數層級的已耗用時間。


著作權聲明:本文為博主原創文章,未經博主允許不得轉載。

演算法(第四版)學習筆記之java實現堆排序

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.