1. 程式人生 > 實用技巧 >241. 為運算表示式設計優先順序

241. 為運算表示式設計優先順序

演算法:

1、堆的定義:當一棵二叉樹的每個結點都大於等於它的兩個子節點時,它被稱為堆有序。

2、堆排序可以分為兩個階段。在堆的構造階段中,我們將原始陣列重新組織安排進一個堆中;然後在下沉排序階段,我們從堆中按遞減順序取出所有元素並得到排序結果。

複雜度:

用下沉操作由N個元素構造堆只需少於2N次比較以及少於N次交換。

將N個元素排序,堆排序只需少於(2NlgN+2N)次比較(以及一半次數的交換)。

程式碼:

public class HeapSort {
    
    public static void sort(int []arr){
        //1.構建大頂堆
for(int i=arr.length/2-1;i>=0;i--){ //從第一個非葉子結點從下至上,從右至左調整結構 adjustHeap(arr,i,arr.length); } //2.調整堆結構+交換堆頂元素與末尾元素 for(int j=arr.length-1;j>0;j--){ swap(arr,0,j);//將堆頂元素與末尾元素進行交換 adjustHeap(arr,0,j);//重新對堆進行調整 } }
/** * 調整大頂堆(僅是調整過程,建立在大頂堆已構建的基礎上) */ public static void adjustHeap(int []arr,int i,int length){ int temp = arr[i];//先取出當前元素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){//如果子節點大於父節點,將子節點值賦給父節點(不用進行交換) arr[i] = arr[k]; i = k; }else{ break; } } arr[i] = temp;//將temp值放到最終的位置 } public static void swap(int []arr,int a ,int b){ int temp=arr[a]; arr[a] = arr[b]; arr[b] = temp; } public static void main(String []args){ int []arr = {7,3,5,6,9,2}; sort(arr); System.out.println(Arrays.toString(arr)); } }

參考資料:

《演算法》-Sedgewick

圖解堆排序