阅读背景:

算法入门--堆排序2(建立最小堆,从大到小)

来源:互联网 
 
 
 
 
#include <stdio.h>#include <stdlib.h>int left(int i)//返回左孩子位置 {    return 2*i;}int right(int i)//返回右孩子位置 {    return 2*i+1;}void min_heapify(int *a,int heap_size,int i)//保持堆性质,使以i为根的子树成为最小堆 ,heap_size当前堆中元素数量 {     int l,r,least;     int temp;     l=left(i);     r=right(i);     if(l<=heap_size&&a[l]<a[i])         least=l;     else         least=i;     if(r<=heap_size&&a[r]<a[least])         least=r;     if(least!=i)     {          temp=a[i];          a[i]=a[least];          a[least]=temp;          min_heapify(a,heap_size,least);     }}void build_min_heap(int *a,int length)//建立最小堆 {     int i,heap_size;     for(i=length/2;i>=1;i--)      min_heapify(a,length,i);    }void heap_sort2(int *a,int length)//堆排序,从大到小 ,length为堆中元素数量 {     int heap_size=length;     int i,temp;     build_min_heap(a,length);//建立最小堆     for(i=length;i>=2;i--)     {           temp=a[i];           a[i]=a[1];           a[1]=temp;           heap_size--;           min_heapify(a,heap_size,1);//重新调整为最小堆      }      }int main(int argc, char *argv[]){  //  int a[11]={0,4,1,3,2,16,9,10,14,8,7};//测试数据  //int length=10;    int length;//数组中的堆的数据的长度     int a[100];    a[0]=0;     int i;    printf("请输入元素的数量:");    scanf("%d",&length);    printf("\n请依次输入%d个元素,空格结束:\n",length);    for(i=1;i<=length;i++)    scanf("%d",&a[i]);     printf("\n");    for(i=1;i<=length;i++)    printf("%d ",a[i]);    printf("\n------------------------\n");    printf("建立最小堆以后\n");    build_min_heap(a,length);    for(i=1;i<=length;i++)    printf("%d ",a[i]);    printf("\n");    printf("使用堆排序后:\n");    heap_sort2(a,length);    for(i=1;i<=length;i++)    printf("%d ",a[i]);  system("PAUSE");	  return 0;}#include <stdio.h>#include <stdlib.h>int 



你的当前访问异常,请进行认证后继续阅读剩余内容。

分享到: