左神演算法第二週 認識O NlogN 的排序

2021-10-10 09:47:06 字數 891 閱讀 9762

將陣列分成兩部分,左邊排序,右邊排序,最後將左右兩邊合併成整體有序的陣列。

歸併排序的擴充套件:

小和問題和逆序對問題:

小和問題:在乙個陣列中,每乙個數左邊比當前小的數累加起來,叫做這個陣列的小和。求陣列的小和。

用改造後的歸併進行解決,在合併時求出小和,合併時左邊比右邊的數小時產生小和,小多少個產生多少個小和。

完全二叉樹:滿二叉樹 或者 非滿二叉樹但最後一層從左到右依次有節點

陣列下標與完全二叉樹的對應: (從0開始的)

i 位置的左子節點:2*i+1

i 位置的右子節點:2*i+2

i 位置的父節點:(i-1)/2

堆:完全二叉樹。

大根堆:在該二叉樹中,每一顆子樹的最大值都是子樹的頭結點。

heapinsert:新插入的節點與父節點比較,若新節點的值比父節點的值大,則與父節點交換,一直比較到父節點的值比新節點的值大或者已經成為根節點為止。時間複雜度 o(logn)

heapify:將原本的根節點取出,用最後乙個節點取代根節點,有效區長度減一,然後將根節點下沉,下沉方法:找到左右孩子中較大的節點,用根與之比較,比它小則下沉,比它大或者沒有孩子了就停止。時間複雜度 o(logn)

堆排序:建成大根堆以後,將根與堆尾的元素交換,此時堆尾就是陣列中最大的數,然後執行heapify,heapify執行後又成為乙個大根堆,繼續交換並heapify,迴圈往復直到有效區變成0就排序完成。時間複雜度為 o(nlogn)

建大根堆有兩種方式,如果一次只輸入乙個數,只能用heapinsert乙個乙個插入(o(nlogn)),如果一次將整個陣列的值給定,可以對陣列從後向前 heapify (o(n)),會更快。

priorityqueue 可以當成小根堆使用。

左神演算法學習日記 堆(二)

include include include include include include include includeusing namespace std class project project const project p push進堆時用到了拷貝建構函式,雖然不寫也無所謂 pro...

左神演算法筆記(二) 快速排序,堆

08荷蘭國旗問題 將小於大於區域進行劃分,當數值小於則將資料放到左邊,l 1,當資料大於則將資料放到右邊r,同時將r 1.由於荷蘭問題較為簡單,因此在這裡不再編寫 public static void quicksort int arr quicksort arr,0,arr.length 1 pu...

左神演算法 基礎班第二課 一 荷蘭國旗

問題 荷蘭國旗問題,給定乙個陣列,讓小於0的在左邊,大於0的在右邊,0在中間 如輸入 1,2,3,0,3,0 輸出 2,3,0,0,3,1 思路 設定3個游標l 0,r n 1,current 0 l的左邊小於0,r的右邊大於0,中間為0 三種情況 a current 0時,swap a curre...