算法入门--堆排序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;
}
    原文作者:排序算法
    原文地址: https://blog.csdn.net/cfan0801/article/details/7008957
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞