排序演算法之:堆排序

來源:互聯網
上載者:User

堆排序(Heapsort)是指利用堆這種資料結構所設計的一種排序演算法,可以利用數組的特點快速定位指定索引的元素。

 

堆排序(HeapSort)是一樹形選擇排序。堆排序的特點是:在排序過程中,將集合看成是一棵完全二叉樹的順序儲存結構,利用完全二叉樹中雙親結點和孩子結點之間的內在關係,在當前無序區中選擇關鍵字最大(或最小)的記錄

 

 

看實現:

 

/**<br /> * 堆排序<br /> *<br /> */<br />public class HeapSorter {</p><p> public void sort(Integer[] array, int from, int len) {<br /> build_heap(array,from,len);<br /> for(int i=0;i<len;i++)<br /> {<br /> //把最大的跟置換到最後面<br /> swap(array,from,from+len-1-i);<br /> shift_down(array,from,len-1-i,0);//始終從根節點開始置換,最大的上升到根節點,小的下沉到葉子節點<br /> }<br /> }</p><p> //轉換數組的兩項<br /> private void swap(Integer[] array,int x,int y) {<br /> Integer temp = array[x];<br /> array[x]=array[y] ;<br /> array[y]=temp;<br /> }</p><p> private final void build_heap(Integer[] array, int from, int len) {<br /> int pos=(len-1)/2;//從第一個非葉子節點開始<br /> for(int i=pos;i>=0;i--)<br /> {<br /> shift_down(array,from,len,i);<br /> }<br /> }<br /> //把所有的非葉子節點同子節點比較 第pos個元素 選擇與子節點中最大的元素與該節點置換<br /> private final void shift_down(Integer[] array,int from, int len, int pos){<br /> //暫時儲存該節點的值, 因為這裡可能不只進行一次比較<br /> Integer tmp=array[from+pos];</p><p> int index=pos*2+1;//得到當前pos節點的左節點<br /> while(index<len)//還存在左節點<br /> {<br /> if(index+1<len&&array[from+index].compareTo(array[from+index+1])<0)//如果存在右節點 則比較<br /> {<br /> //如果右邊節點比左邊節點大<br /> index+=1;<br /> }<br /> //因為下面是單向賦值,所以這裡要用tmp進行比較<br /> if(tmp.compareTo(array[from+index])<0){<br /> //注意這裡是單向賦值,少了一次置換,當前值已經賦給tmp<br /> array[from+pos]=array[from+index];<br /> //進行了置換操作後,以置換的子節點為起點 (如果存在子節點) 還要繼續進行該操作<br /> pos=index;<br /> index=pos*2+1;</p><p> }else{<br /> break;<br /> }<br /> }<br /> //最終全部置換完畢後 才把臨時變數賦給最後的節點<br /> array[from+pos]=tmp;<br /> }<br /> // 列印數組<br />public void printArray(Integer[] a) {<br />System.out.println();<br />for (int i = 0; i < a.length; i++) {<br />System.out.print(a[i] + " ");<br />if ((i + 1) % 5 == 0) {<br />}<br />}<br />System.out.println();<br />}<br />public static void main(String[] args) {<br />Integer[] a = { 45, 26, 13, 27, 35, 10, -455, -90, 2008, 1024, 101,<br />555, 216, 82 };<br />HeapSorter aa = new HeapSorter();<br />aa.sort(a, 0, a.length);<br />aa.printArray(a);<br />}</p><p>}

 

演算法分析

  堆[排序的時間,主要由建立初始堆和反覆重建堆這兩部分的時間開銷構成,它們均是通過調用Heapify實現的。
 

 

     堆排序的最壞時間複雜度為O(nlog2n)
。堆序的平均效能較接近於最壞效能。
  

 

     由於建初始堆所需的比較次數較多,所以堆排序不適宜於記錄數較少的檔案。
  

 

     堆排序是就地排序,輔助空間為O(1),
  

 

     它是不穩定
的排序方法。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.