堆排序
来源:互联网 发布:威廉马歇尔 知乎 编辑:程序博客网 时间:2024/05/29 15:44
#include <stdio.h>#include <stdlib.h>#include <math.h>int PARENT(int i) //父节点{ return floor(2/i);}int LEFT(int i) //左孩子{ return 2*i;}int RIGHT(int i) //右孩子{ return 2*i+1;}void MAX_HEAPIFY(int A[],int i,int size_heap) //保持最大堆特性的函数调整函数,堆由数组实现{ int largest; int l = LEFT(i); int r = RIGHT(i); if(l <= size_heap && A[l] > A[i]) largest = l; else largest = i; if(r <= size_heap && A[r] > A[largest]) largest = r; if(largest != i) { int temp = A[i]; A[i] = A[largest]; A[largest] = temp; MAX_HEAPIFY(A,largest,size_heap); }}void BUILD_MAXHEAP(int A[],int *size_heap,int len){ int i = 0; *size_heap = len; for(i = floor(len/2);i >= 1;i--) { MAX_HEAPIFY(A,i,*size_heap); }}void HEAP_SORT(int A[],int length) //先对A进行堆构造,然后对A的最大值进行兑换,{ //把A[1]放到最后,并且堆规模减一,表示把最后一个最大值从除去 int temp,i; int size_heap; BUILD_MAXHEAP(A,&size_heap,length); for(i = size_heap;i > 1;i--) { temp = A[size_heap]; A[size_heap] = A[1]; A[1] = temp; size_heap--; MAX_HEAPIFY(A,1,size_heap); }}int main(){ int A[11] = {0,1,5,7,3,8,9,2,4,20,34}; HEAP_SORT(A,10); int i; for(i = 1;i <= 10;i++) printf("%d ",A[i]); return 0;}