| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2619 人关注过本帖
标题:堆排序(多关键字)
只看楼主 加入收藏
马后炮
Rank: 7Rank: 7Rank: 7
等 级:黑侠
帖 子:156
专家分:560
注 册:2010-12-17
收藏
得分:4 
你的多关键字写的太蛋疼了,直接一个结构体最好,原来的代码根本不用改多少,只需要改cmp

樱之雪,晓之车
2011-01-29 15:52
点线面
Rank: 8Rank: 8
来 自:NO.-1
等 级:蝙蝠侠
帖 子:525
专家分:980
注 册:2011-1-3
收藏
得分:0 
#define M  //总人数
定义一个
struct student
{
  int   num;       //学生编号
  float chinese;   //语文
  float english;   //英文
  float math;      //数学
  float score_sum; //个人总分
}score[M];
将它们归成类,或者
struct student
{
    float prescore[5]; //个人总分类似上面的
}score[M];
排序,求和和筛选各做封装
主函数有输入,输出,排序函数,筛选函数和求和函数。

[ 本帖最后由 点线面 于 2011-1-29 15:56 编辑 ]

小代码,大智慧
2011-01-29 15:53
sunyh1999
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:14
帖 子:1178
专家分:3032
注 册:2009-5-17
收藏
得分:0 
我现在想知道为什么我写得双关键字排序有问题,就算用了结构体也没用啊

欢迎来到我的博客:http://blog..cn/noisunyuhong
2011-01-29 17:49
点线面
Rank: 8Rank: 8
来 自:NO.-1
等 级:蝙蝠侠
帖 子:525
专家分:980
注 册:2011-1-3
收藏
得分:0 
堆排序从二叉堆(优先队列)总结出来,好像它有两个是关键是一个是从底插入,一个是删除最小元素....

小代码,大智慧
2011-01-29 17:57
sunyh1999
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:14
帖 子:1178
专家分:3032
注 册:2009-5-17
收藏
得分:0 
这个程序怎么改,LS听不懂

欢迎来到我的博客:http://blog..cn/noisunyuhong
2011-01-29 17:58
sunyh1999
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:14
帖 子:1178
专家分:3032
注 册:2009-5-17
收藏
得分:0 
回复 11楼 马后炮
cmp是什么东西?怎么改?

欢迎来到我的博客:http://blog..cn/noisunyuhong
2011-01-29 17:59
点线面
Rank: 8Rank: 8
来 自:NO.-1
等 级:蝙蝠侠
帖 子:525
专家分:980
注 册:2011-1-3
收藏
得分:0 
排序部分可以一般排序,看一看有什么问题,是不是排序问题,还是其它问题。

小代码,大智慧
2011-01-29 18:00
sunyh1999
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:14
帖 子:1178
专家分:3032
注 册:2009-5-17
收藏
得分:0 
这个问题弄了我2天,我觉着没什么问题呀,但是结果就很令人。。。

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



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

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