堆排序实现

1. 对于堆, 结点I的左子2*i +1 右子2*i + 2

2. 对于n的堆, 第一个非叶子结点是n/2 - 1, 考虑到数组是从0开始的, 最后一个结点是n-1, 第一个是0

3. 删除和添加是在AdjustHeap()的基础上实现的

#include<stdio.h>
void swap(int *a, int *b)
{
    int tem = *a;
    *a = *b;
    *b = tem;
}

void AdjustHeap(int *ar, int parent, int n)
{
    if(n==1||parent>n/2-1)
        return;
    int left = 2*parent+1;
    int right = 2*parent+2;
    if(right<=n-1)
    {
        if(ar[parent]>=ar[left]&&ar[parent]>=ar[right])
            return;
        else
        {
            if(ar[left]>ar[parent]&&ar[left]>=ar[right])
            {
                swap(&ar[left],&ar[parent]);
                AdjustHeap(ar,left,n);
            }
            if(ar[right]>ar[parent]&&ar[right]>=ar[left])
            {
                swap(&ar[right],&ar[parent]);
                AdjustHeap(ar,right,n);
            }
        }
    }
    else
    {
        if(ar[parent]>=ar[left])
            return;
        else
        {
            swap(&ar[parent],&ar[left]);
            AdjustHeap(ar,left,n);
        }
    }
}

void HeapSort(int *ar, int n)
{
    int i;
    for(i=n/2-1;i>=0;i--)
        AdjustHeap(ar,i,n);
    for(i=n-1;i>0;i--)
    {
        swap(&ar[0], &ar[i]);
        AdjustHeap(ar,0,i);
    }
}

int main()
{
    int n;
    int a[100];
    while(~scanf("%d",&n))
    {
        int i;
        for(i=0;i<n;i++)
            scanf("%d",&a[i]);
        HeapSort(a,n);
        for(i=0;i<n;i++)
            printf("%d  ",a[i]);
        printf("
 ");
    }
    return 0;
}


每天早上叫醒你的不是闹钟,而是心中的梦~
原文地址:https://www.cnblogs.com/vintion/p/4116915.html