堆排序分析實現

2021-08-23 14:35:23 字數 1281 閱讀 9229

演算法思想

若公升序,建大堆,每次選擇堆頂元素即最大的數,和最後一位交換,再縮小堆的範圍(避免剛排好的最後乙個位置被調回去),對剩下的進行向下調整(此時只有根節點不對,左右子樹都滿足大堆)。反覆進行直到堆的範圍為0.則資料就有序了。

**實現思路

堆排序的實現首先是需要將陣列調整為乙個大堆或者小堆,然後就是迴圈交換和調整堆的過程。因為在建堆和調整堆過程都用到了將陣列的某一部分調整為乙個堆,所以抽出為乙個adjustarray(int nums, int start, int end)函式。

時間複雜度

o(nlogn)。

建堆的時間複雜度近似為o(n*log n),每次選乙個數後進行調整的複雜度也近似為o(n*log n),時間複雜度忽略係數,結果就近似為o(n*log n)。

空間複雜度

o(1)

穩定性不穩定。

堆的調整時可能會打亂穩定性。

**實現

package sort;

/** * @排序方法:堆排序

* @時間複雜度:o(nlogn)。建堆的時間複雜度近似為o(n*log n),每次選乙個數後進行調整的複雜度也近似為o(n*log n),時間複雜度忽略係數,結果就近似為o(n*log n).

* @空間複雜度:o(1)

* @穩定性:不穩定

*/public

class

heapsort

}//堆化陣列

public

static

void

heaparray(int nums)

}//對某個節點進行一次從上到下的調整(建小堆的調整)

public

static

void

adjustarray1(int nums, int start, int end)else

}else}}

//建大堆的調整

public

static

void

adjustarray(int nums, int start, int end)else

}else}}

public

static

void

main(string args) ;

heapsort(nums);

for (int i = 0; i < nums.length; i++)

}}

參考鏈結

白話經典演算法系列之七 堆與堆排序

【資料結構】幾種常見的排序演算法

穩定排序和不穩定排序

堆排序分析及php實現

堆排序 是一種特殊形式的選擇排序,他是簡單選擇排序的一種改進。什麼是堆?具有n個元素的序列 ki k2i,ki k2i 1 或者 ki k2i,ki k2i 1 i 1,2,3,4.n 2 滿足這個條件時,該序列就是乙個堆。第乙個條件稱為小頂堆,第二個條件稱為大頂堆。為了方便,下邊論述基於大頂堆,並...

堆排序分析及php實現

堆排序 是一種特殊形式的選擇排序,他是簡單選擇排序的一種改進。什麼是堆?具有n個元素的序列 ki k2i,ki k2i 1 或者 ki k2i,ki k2i 1 i 1,2,3,4.n 2 滿足這個條件時,該序列就是乙個堆。第乙個條件稱為小頂堆,第二個條件稱為大頂堆。為了方便,下邊論述基於大頂堆,並...

排序演算法 堆排序演算法實現及分析

堆排序 heap sort 就來利用堆 假設利用大頂堆 進行排序的方法。它的基本思想是,將待排序的序列構成乙個大頂堆。此時,整個序列的最大值就是堆頂的根結點。將它移走 其實就是將其與堆陣列的末尾元素交換,此時末尾元素就是最大值 然後將剩餘的n 1個序列重新構造成乙個堆,這樣就會得到n個元素中的次小值...