3. 堆排序

成绩10开启时间2018年11月25日 星期日 18:00
折扣0.8折扣时间2018年12月15日 星期六 23:55
允许迟交关闭时间2018年12月25日 星期二 23:55

实验要求:用堆排序算法按关键字递减的顺序排序。

 

程序输入:待排序记录数(整数)和待排序记录(整数序列);

 

程序输出:建堆结果和建堆后第一、第二次筛选结果。(注:待排序记录数大于等于3)

 测试输入关于“测试输入”的帮助期待的输出关于“期待的输出”的帮助时间限制关于“时间限制”的帮助内存限制关于“内存限制”的帮助额外进程关于“{$a} 个额外进程”的帮助
测试用例 1以文本方式显示
  1. 6↵
  2. 11↵
  3. 12↵
  4. 16↵
  5. 14↵
  6. 15↵
  7. 10↵
以文本方式显示
  1. 16 15 11 14 12 10 ↵
  2. 15 14 11 10 12 ↵
  3. 14 12 11 10 ↵
1秒64M0
测试用例 2以文本方式显示
  1. 9↵
  2. 9↵
  3. 8↵
  4. 7↵
  5. 6↵
  6. 5↵
  7. 4↵
  8. 3↵
  9. 2↵
  10. 1↵
以文本方式显示
  1. 9 8 7 6 5 4 3 2 1 ↵
  2. 8 6 7 2 5 4 3 1 ↵
  3. 7 6 4 2 5 1 3 ↵
1秒64M0

 

#include<stdio.h>  
#include<stdlib.h>  

int heap[200];  
int length;
void HeapAdjust(int x,int t)
{    
    //i代表现在为止,j代表左右子树位置
    int i,j,up;
        i=x;
        j=2*i;
        up=heap[i];
        while(j<=t)
        {        if(j<t&&heap[j]<heap[j+1])
                        j++;
                if(up<heap[j])
                {        heap[i]=heap[j];
                        i=j;
                        j=2*i;
                }
                else
                {        j=t+1;
                }
        }
        heap[i]=up;
}

// void HeapAdjust( int x, int y)
// {  
//     int rc=heap[x];  
//     for(int j=2*x;j<=y;j*=2){    
//         if(j<y && rc < heap[j])
//             j++;
//         if(rc < heap[j])   
//             break;        
//         heap[x]=heap[j];  
//         x=j;  
//     }  
//     heap[x]=rc;  
//     heap[1]=heap[y];  
// }  

void HeapSort()   
{  
    int i;    
    for(i = length/2; i>0; i--){  
        HeapAdjust(i,length);  
    }   

}  

int main() 
{  
    scanf("%d",&length);  
    for(int i=1; i<=length ;i++)  
        scanf("%d",&heap[i]);  
    for(int q = 0; q < 3; q++){
        HeapSort();
        for(int i=1;i<=length;i++)  
            printf("%d ",heap[i]);  
        printf("\n");
        int temp = heap[1];
        heap[1] = heap[length];
        heap[length] = heap[1];
        length--;
    }
    return 1;
}  

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值