void heap_build(vector& nums, int root,int length)
// 某個節點為k,那麼他的父節點下標為(k-1)/2,左右子節點下標為2k+1,2k+2
if (nums[root] < nums[flag])//把最大值放到root上
} }void heap_sort(vector& nums, int len)
// 公升序用大頂堆,降序用小頂堆
// 整體主要由構建初始堆+交換堆頂元素和末尾元素並重建堆兩部分組成
for (int j = len - 1; j > 0; j--)// 將最大值往後放,
}
for (int j = len - 1; j > 0; j--)// 將最大值往後放,
問題出現在這裡,每一次將最大值往後放了,乙個小值放到堆頂,那他跟原來最大值的兩個子節點比較很大概率還是小的,他要下沉下去也會浪費更多的步驟。雖然最壞時間複雜度是o(nlogn),但是複雜度的常數項會更大一些。
快排 堆排序
快速排序主要運用了二分的思想,每次選擇乙個基準元素,比基準元素打的元素都放在基準元素前面,比基準元素小的元素都放在基準元素後面,這樣不斷遞迴細分,完成排序。void quicksort int a,int l,int r if ia i a j i while ia i temp if ia j a...
快排 堆排序
荷蘭國旗問題 經典快排 改進快排 隨機快排 堆結構 from左神演算法初級班第二節 問題一 給定乙個陣列arr,和乙個數num,請把小於等於num的數放在數 組的左邊,大於num的數放在陣列的右邊。要求額外空間複雜度o 1 時間複雜度o n 問題二 荷蘭國旗問題 給定乙個陣列arr,和乙個數num,...
排序介紹(選擇 冒泡 快排 堆排序)
問題描述 排序問題 給出一組數字,要求按照數值的大小進行排序 例如 這組資料進行公升序的排列後的順序為 氣泡排序 是一種簡單的排序演算法,它實現的過程 不斷重複的走訪過要排列的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來,走訪數列的工作就是重複的進行,直到沒有再需要進行交換的的時候,就...