堆排序

来源:互联网 发布:淘宝信用值 评论 编辑:程序博客网 时间:2024/05/28 18:42
#include <stdio.h> #include <stdlib.h> #include <time.h> //int mydata[20]={0,98,81,49,73,36,27,40,55,64,12};int mydata[20]={0,12,64,55,40,27,36,73,49,81,98};int high,low;void swap(int *a,int *b){int temp;temp=*a;*a=*b;*b=temp;}void printf_array(int *a,int n){int i;for(i=1;i<=n;i++) { printf( "%d\t ",a[i]);} printf("\n");}int get_max_heap(int *a,int index,int len)  //获取下标为index,2*index,2*index+1中的最大值的下标 len:最大长度{int left,right,largest;left=2*index;right=2*index+1;largest=index;if(left<=len&&a[left]>a[largest]) //如果左孩子大于根节点largest=left;if(right<=len&&a[right]>a[largest]) //如果右孩子大于根节点largest=right;return largest;}int heap_adjust(int *a,int index,int len){int i,largest;for(i=index;i<=len;){largest=get_max_heap(a,i,len);  //获取index子树的最大值下标if(largest==i) //根节点最大{return 1;}else          //子节点最大,交换两个节点{swap(&a[i],&a[largest]);i=largest;}}}int   main() { int location,i,len;len=10;printf_array(mydata,len);for(i=len/2;i>0;i--)heap_adjust(mydata,i,len);       //将1---len调整为大顶堆printf_array(mydata,len);for(i=len;i>1;i--){swap(&mydata[1],&mydata[i]);     //将堆顶记录和1----i中最后一个记录交换heap_adjust(mydata,1,i-1);       //将1----i-1调整为大顶堆}printf_array(mydata,len);//printf("location=%d\n",location);return 1;}