排序演算法 - 堆排序
堆排序時利用堆進行排序的。
堆:具有以下性質的完全二叉樹:每個結點的值都大於或等於其左右孩子結點的值,稱為大頂堆;或者每個結點的值都小於或等於其左右孩子結點的值,稱為小頂堆。堆左右孩子之間的大小沒有要求。
堆排序的基本思想是:將待排序序列構造成一個大頂堆(小頂堆),此時,整個序列的最大值就是堆頂的根節點。將其與末尾元素進行交換,此時末尾就為最大值。然後將剩餘n-1個元素重新構造成一個堆,這樣會得到n個元素的次小值。
package com.zx.sort;
import java.util.Arrays;
public class Heap {
public static void main(String []args){
int []arr = {5,3,69,132,5,65,13,4};
sort(arr);
System.out.println(Arrays.toString(arr));
}
public static void sort(int []arr){
for(int i=arr.length/2-1;i>=0;i--){
//從最後一個非葉子節點開始從下往上,從右至左調整堆結構
adjustHeap(arr,i,arr.length);
}
for(int j=arr.length-1;j>0;j--){
//將堆頂元素與末尾元素進行交換
int temp=arr[0];
arr[0] = arr[j];
arr[j] = temp;
adjustHeap(arr,0,j);//重新對堆進行調整
}
}
public static void adjustHeap(int []arr,int i,int length){
int temp = arr[i];
for(int k=i*2+1;k<length;k=k*2+1){//從i結點的左子結點開始,也就是2i+1處開始
if(k+1<length && arr[k]<arr[k+1]){//如果左子結點小於右子結點,k指向右子結點
k++;
}
if(arr[k] >temp){//將子節點值賦給父節點(不用進行交換,因為最後temp會放置到最終的位置(i處),就是i與最大的直接交換下)
arr[i] = arr[k];
i = k;
}else{
break;
}
}
arr[i] = temp;//將temp值放到最終的位置
}
}
堆排序最壞,最好,平均時間複雜度均為O(nlogn),它是不穩定的排序。
相關文章
- 排序演算法__堆排序排序演算法
- 排序演算法-堆排序排序演算法
- C#堆排序演算法C#排序演算法
- 圖解堆排序演算法圖解排序演算法
- 夯實基礎:排序演算法之堆排序排序演算法
- 看懂堆排序——堆與堆排序(三)排序
- 堆排序排序
- 演算法學習之選擇排序和堆排序:演算法排序
- python 堆排序Python排序
- js堆排序JS排序
- 【譯】Swift演算法俱樂部-堆排序Swift演算法排序
- 常見演算法 PHP 實現 -- 堆排序演算法PHP排序
- 資料結構與演算法:堆排序資料結構演算法排序
- 【資料結構與演算法】堆排序資料結構演算法排序
- 資料結構與演算法——堆排序資料結構演算法排序
- Python 一網打盡<排序演算法>之堆排序演算法中的樹Python排序演算法
- 堆排序 Heap Sort排序
- 堆排序詳解排序
- 堆排序(C++)排序C++
- 演算法與資料結構之原地堆排序演算法資料結構排序
- 排序演算法:堆排序的實現和時間複雜度分析排序演算法時間複雜度
- js 實現堆排序JS排序
- 堆與堆排序(一)排序
- php插入排序,快速排序,歸併排序,堆排序PHP排序
- 堆排序和快速排序效能比較排序
- 【小小前端】前端排序演算法第三期(不簡單選擇排序-堆排序)前端排序演算法
- 堆排序(實現c++)排序C++
- 堆排序c++實現排序C++
- 使用 Swift 實現堆排序Swift排序
- 順序表的堆排序排序
- 淺解前端必須掌握的演算法(五):堆排序(下)前端演算法排序
- 淺解前端必須掌握的演算法(五):堆排序(上)前端演算法排序
- 堆排序就這麼簡單排序
- 二叉堆及堆排序排序
- HDU 1040 As Easy As A+B(堆排序)排序
- 優先佇列和堆排序佇列排序
- 堆的基本操作及堆排序排序
- rust-algorithms:8-堆排序RustGo排序