堆排序

来源:互联网 发布:乐玩编程助手 编辑:程序博客网 时间:2024/06/07 05:14
























#include<stdio.h>
#include<stdlib.h>
//自底向上构建最大堆,然后每次保存最大堆的根节点,即可完成堆排序
//堆排序
int a[11]={0,1,3,2,5,4,7,6,8,10,9};
int heapnum = 10;
void MAX(int i)            //在两个最大堆作为新加元素的子节点时,把新构成的堆再次Build成最大堆
{
        int l= 2*i;
        int r= 2*i+1;
        int largest = i;
        if(l<=heapnum)
        if(a[l] > a[i])
        {
                largest =l;;
        }
        if(r<= heapnum)
        if(a[r] > a[largest])
        {
                largest = r;
        }
        if(largest != i)
        {
                int temp = a[i];
                a[i] = a[largest];
                a[largest] = temp;
                MAX(largest);
        }
}
void BUILD(void)     //如果有n个元素构建堆时,有n/2上限个叶节点;依这些叶节点为基础建立整个数组的最大堆,因此i的取值范围是n/2下限到1。
{
        int i = heapnum/2;
        for(i=heapnum/2;i>=1;i--)
        {
                MAX(i);
        }
}
void SORT(void)          //最大堆堆顶的元素是数组中最大的元素,每次排序时将堆顶元素与最后一个元素交换,然后将最大堆中元素数目减1,然后将新形成的堆重新构建成最大堆。这样,每次循环后,堆的第一个数都是数组中最大的数据,然后把其放在数组的最后一位。依次循环即可形成升序排列数组。
{
        for(int i=10;i>=2;i--)
        {
                int temp = a[1];
                a[1] = a[i];
                a[i] = temp;
                heapnum--;
                MAX(1);
        }
}
void OUT(void)
{
        for(int i=1;i<=10;i++)
        printf("%d ",a[i]);
}
int main()
{
        BUILD();
        SORT();
        OUT();
        return 0;
}



********************************************************************************************************************************************************************************888888

*******************************************************************************************************************************************************************************8888888





#include<stdio.h>
#include<stdlib.h>
int n;
int heapnum;
int a[1000];
void MAX(int i)
{
        int l= 2*i;
        int r= 2*i+1;
        int largest = i;
        if(l<=heapnum)
        if(a[l] > a[i])
        {
                largest =l;;
        }
        if(r<= heapnum)
        if(a[r] > a[largest])
        {
                largest = r;
        }
        if(largest != i)
        {
                int temp = a[i];
                a[i] = a[largest];
                a[largest] = temp;
                MAX(largest);
        }
}
int main()
{
        while(scanf("%d",&n)!=EOF)
        {
                for(int i=1;i<=n;i++)
                        scanf("%d",&a[i]);
                heapnum=n;
                int i = heapnum/2;
        for(i=heapnum/2;i>=1;i--)
        {
                MAX(i);
        }
        for(int j=n;j>=2;j--)
        {
                int temp = a[1];
                a[1] = a[j];
                a[j] = temp;
                heapnum--;
                MAX(1);
        }
        for(int i=1;i<=n;i++)
                printf("%d ",a[i]);
        }
        return 0;
}

原创粉丝点击