最大堆和利用堆的性質對陣列進行排序。
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 每個結點的左子樹和右子樹都是乙個二叉堆...