堆與堆排序

2022-05-02 22:15:10 字數 837 閱讀 2525

最大堆和利用堆的性質對陣列進行排序。

heapfy函式是將節點i為根節點的子樹變為最大堆(注意是維護後的i節點作為子樹的根節點),length引數為堆得的元素個數

buildheap函式是將長度為length的陣列建成乙個最大堆。這裡對每乙個非葉子節點進行heapfy

heapsort對長度為length的陣列進行排序(共有length個元素需要排序,下表從1開始)。步驟為先建乙個最大堆,然後將堆頂元素與末尾元素互換,然後維護length-1個數的堆,直至堆的長度為1。這裡有個關鍵的地方就是:如果節點的左右兩顆子樹分別為最大堆,則維護以i為根節點的堆必為最大堆。

**如下:

#include#includevoid printarray(int *array,int length)

printf("\n");

}void heapfy(int *array,int length,int i)else

if(right<=length&&array[right]>array[large])

if(large!=i)

}void buildheap(int *array,int length)

}void heapsort(int *array,int length)

}int main(void);//1 to 10

printf("before:\n");

printarray(a,10);

heapsort(a,10);

printf("after:\n");

printarray(a,10);

return 0;

}

堆與堆排序

二叉堆是完全二叉樹或者是近似完全二叉樹。二叉堆滿足二個特性 1 父結點的鍵值總是大於或等於 小於或等於 任何乙個子節點的鍵值。2 每個結點的左子樹和右子樹都是乙個二叉堆 都是最大堆或最小堆 當父結點的鍵值總是大於或等於任何乙個子節點的鍵值時為最大堆。當父結點的鍵值總是小於或等於任何乙個子節點的鍵值時...

堆與堆排序

堆排序與快速排序,歸併排序一樣都是時間複雜度為o n logn 的幾種常見排序方法。堆排序是就地排序,輔助空間為o 1 它是不穩定的排序方法。排序的穩定性是指如果在排序的序列中,存在前後相同的兩個元素的話,排序前 和排序後他們的相對位置不發生變化 先說說什麼是堆,堆通常是乙個可以被看做一棵樹的陣列物...

堆與堆排序

堆排序與快速排序,歸併排序一樣都是時間複雜度為o n logn 的幾種常見排序方法。學習堆排序前,先講解下什麼是資料結構中的二叉堆。二叉堆是完全二叉樹或者是近似完全二叉樹。二叉堆滿足二個特性 1 父結點的鍵值總是大於或等於 小於或等於 任何乙個子節點的鍵值。2 每個結點的左子樹和右子樹都是乙個二叉堆...