堆排

建立大堆,输出递增排序。建立一个大堆,第一个元素一定是最大的。建堆的时间是(log n),所以查找数组的最大值,用建堆的方法只用(log n)的时间。


#include<stdio.h>
void swap(int *a,int *b)     //交换
{
    int * c=0;
    *c=*a;
    *a=*b;
    *b=*c;
}

void adjustHeap(int arr[],int n,int i)   //核心,从数组的arr[i]调整堆次序,确保是大堆。
{
   int j;
   int temp=arr[i];
   j=2*i+1;
   while(j<n)                                         //循环,调整的时候考虑对下层的影响
   {
        if(j+1<n&&(arr[j]<arr[j+1]))    
            j++;
        if(arr[j]<=temp)
            break;
        arr[i]=arr[j];
        i=j;
        j=2*i+1;
   }
   arr[i]=temp;
}

void markHeap(int arr[],int n)     //数组的后一半元素都是叶子,默认已经排好次序,所以从前一半的元素调整就可以了。
{
    int i;
    for(i=n/2-1;i>=0;--i)
        adjustHeap(arr,n,i);
}

void sort(int arr[],int n)        
{
    int i;
    for(i=n-1;i>0;--i)
    {

        swap(&arr[0],&arr[i]);            //把第一个元素(最大的)和最后一个调整,实现排序
        adjustHeap(arr,i,0);
    }
}


int main()
{
    int i=0;
    int arr[]={111,5,3,78,45,1,0,-1,1121,2};
    int size=sizeof(arr)/sizeof(int);
    markHeap(arr,size);
    printf("Heap=");
    for(;i<size;i++)
        printf ("%5d",arr[i]);
    sort(arr,size);
    printf("\nsort=");
    for(i=0;i<size;i++)
        printf ("%5d",arr[i]);
    getch();
    return 0;
}




堆的插入:

void insert(int a[],int i)
{
    int j;
    for(j=(i-1)/2;i>=1&&(a[i]>a[j]);i=j)  //核心,从下到上的调整
        swap(&a[i],&a[j]);

}

void add(int a[],int n,int value)
{
    a[n]=value;
    insert(a,n);
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值