演算法思想
若公升序,建大堆,每次選擇堆頂元素即最大的數,和最後一位交換,再縮小堆的範圍(避免剛排好的最後乙個位置被調回去),對剩下的進行向下調整(此時只有根節點不對,左右子樹都滿足大堆)。反覆進行直到堆的範圍為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個元素中的次小值...