堆排序C語言程式碼
阿新 • • 發佈:2019-02-01
#include<stdio.h> int heap_size; //建堆時參與的元素個數 int parent(int i); //三個節點關係函式 int left_child(int i); int right_child(int i); void max_heap(int *A,int i); //維護最大堆性質 void build_maxheap(int *A); //建立最大堆 int exchange(int *a,int *b); int get_length(int *A); //獲取陣列中總的元素個數 int main() { int i; int A[15]={17,86,8,111,48,44,99,1,24,68,34,19,96,33}; heap_size=get_length(A); //heap_size儲存要排序的元素的個數,在建堆時比陣列下標大1 build_maxheap(A); for(i=heap_size-1;i>0;i--) //heap_size是陣列中下標的最大值,即A[heap_size]是最後一個元素 { exchange(A+i,A); //將最大值交換到陣列末尾 heap_size--; //要處理的元素個數減1 build_maxheap(A); //維護剩餘元素最大堆的性質 } for(i=0;i<get_length(A);i++) printf("%6d",A[i]); } void build_maxheap(int *A) { int i; for(i=parent(get_length(A)-1);i>=0;i--) //從最後一個節點的parent開始建堆 max_heap(A,i); } void max_heap(int *A,int i) { int l,r,largest; l=left_child(i); r=right_child(i); if(l<heap_size&&A[l]>A[i]) //為保證max_heap過程不會影響到已排序的部分,此處應判斷左孩子是否小於heap_size largest=l; else largest=i; if(r<heap_size&&A[r]>A[largest]) largest=r; if(largest!=i) { exchange(A+i,A+largest); max_heap(A,largest); } } int parent(int i) { return (i-1)/2; } int left_child(int i) { return 2*i+1; } int right_child(int i) { return 2*i+2; } int exchange(int *a,int *b) { int temp; temp=*a; *a=*b; *b=temp; return 0; } int get_length(int *A) { int len=0; while(A[len]!='\0') len++; return len; }