| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2619 人关注过本帖
标题:堆排序(多关键字)
取消只看楼主 加入收藏
sunyh1999
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:14
帖 子:1178
专家分:3032
注 册:2009-5-17
收藏
得分:0 
刚才发现了两个小问题,现在成绩已经能正确排序了,但是学号还是有问题:
#include <stdio.h>
#include <stdlib.h>
void sift(int startPos,int endPos,int score[],int number[])
{
    int k=startPos*2+1,temp1,temp2;
    temp1=score[startPos];
    temp2=number[startPos];
    while(k<endPos)
    {
    if(k+1<endPos&&score[k]<score[k+1])k++;
    else if(k+1<endPos&&score[k]==score[k+1]&&number[k]>number[k+1])k++;
    if(temp1<score[k])
    {
    score[startPos]=score[k];
    startPos=k;
    k=startPos*2+1;
    }
    else if(score[k]==temp1&&number[k]>number[k+1])
    {
    score[startPos]=score[k];
    startPos=k;
    k=startPos*2+1;
    }
    else break;
    }
    score[startPos]=temp1;
    number[startPos]=temp2;
}
void heap_sort(int number[],int score[],int n)
{
    int i,temp;
    for(i=n/2;i>=0;i--)
    sift(i,n,score,number);
    for(i=n-1;i>=0;i--)
    {
    temp=number[i];number[i]=number[0];number[0]=temp;
    temp=score[i];score[i]=score[0];score[0]=temp;
    sift(0,i,score,number);
    }
}
int main()
{
    int number[10]={0},score[10]={0},n,i;
    scanf("%d",&n);
    for(i=0;i<n;i++)
    scanf("%d %d",&number[i],&score[i]);
    heap_sort(number,score,n);
    printf("\n");
    for(i=0;i<n;i++)
    printf("%d %d\n",number[i],score[i]);
    system("pause");
    return 0;
}

欢迎来到我的博客:http://blog..cn/noisunyuhong
2011-01-29 18:14
sunyh1999
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:14
帖 子:1178
专家分:3032
注 册:2009-5-17
收藏
得分:0 
AC了,发现number的值没有交换:
#include <stdio.h>
#include <stdlib.h>
void sift(int startPos,int endPos,int score[],int number[])
{
    int k=startPos*2+1,temp1,temp2;
    temp1=score[startPos];
    temp2=number[startPos];
    while(k<endPos)
    {
    if(k+1<endPos&&score[k]<score[k+1])k++;
    else if(k+1<endPos&&score[k]==score[k+1]&&number[k]>number[k+1])k++;
    if(temp1<score[k])
    {
    score[startPos]=score[k];
    number[startPos]=number[k];
    startPos=k;
    k=startPos*2+1;
    }
    else if(score[k]==temp1&&number[k]>number[k+1])
    {
    score[startPos]=score[k];
    number[startPos]=number[k];
    startPos=k;
    k=startPos*2+1;
    }
    else break;
    }
    score[startPos]=temp1;
    number[startPos]=temp2;
}
void heap_sort(int number[],int score[],int n)
{
    int i,temp;
    for(i=n/2;i>=0;i--)
    sift(i,n,score,number);
    for(i=n-1;i>=0;i--)
    {
    temp=number[i];number[i]=number[0];number[0]=temp;
    temp=score[i];score[i]=score[0];score[0]=temp;
    sift(0,i,score,number);
    }
}
int main()
{
    int number[10]={0},score[10]={0},n,i;
    scanf("%d",&n);
    for(i=0;i<n;i++)
    scanf("%d %d",&number[i],&score[i]);
    heap_sort(number,score,n);
    printf("\n");
    for(i=0;i<n;i++)
    printf("%d %d\n",number[i],score[i]);
    system("pause");
    return 0;
}

欢迎来到我的博客:http://blog..cn/noisunyuhong
2011-01-29 18:25
sunyh1999
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:14
帖 子:1178
专家分:3032
注 册:2009-5-17
收藏
得分:0 
这个程序已经写好了,请问我这个程序有什么非常重大的错误?

欢迎来到我的博客:http://blog..cn/noisunyuhong
2011-01-29 18:51
sunyh1999
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:14
帖 子:1178
专家分:3032
注 册:2009-5-17
收藏
得分:0 
你的意思是我的这个程序有问题,还是堆排序有问题?

欢迎来到我的博客:http://blog..cn/noisunyuhong
2011-01-29 18:52
快速回复:堆排序(多关键字)
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.034861 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved