C语言双关键字排序谁会~进来看下

来源:百度知道 编辑:UC知道 时间:2024/09/19 16:33:17
就是关于双关键字排序不太理解
比如5个人学号班级分别是
1001 01
1002 01
1003 02
2001 01
2002 02
按双关键字排序既先按班级,在按学号排,那么顺序应该是
班级 学号
01 1001
01 1002
01 2001
02 1003
02 2002
请问如何实现,用C语言,能不能给个示范程序,谢谢了
万分感谢!

我的想法是,用一种稳定的排序方法(我用的是改进后的冒泡法),先对次要关键字排序,然后对主要关键字排序,代码如下,其中Sort_1是将两次排序整合到了一起,Sort则是直接做两次排序,建议使用Sort。

#include <stdio.h>

typedef struct _student {
int ID,Class;
}student;

//第一种方法,需要调用两次
void Sort_1(student *s,int count,int field) {
int i,j,k;
student tmp,*c=(student*)((int*)s+field);
for (i=0;i<count-1;i++) {
for (k=i,j=i+1;j<count;j++)
if (*(int*)(c+k)>*(int*)(c+j))k=j;
if (k!=i)
tmp=s[k],s[k]=s[i],s[i]=tmp;
}
}

//第二种方法,直接两次排序
void Sort(student *s,int count) {
int i,j,k;
student tmp;
for (i=0;i<count-1;i++) {
for (k=i,j=i+1;j<count;j++)
if (s[k].ID>s[j].ID)k=j;
if (k!=i)
tmp=s[k],s[k]=s[i],s[i]=tmp;
}
for (i=0;i<count-1;i++) {
for (k=i,j=i+1;j<count;j++)
if (s[k].Class>s[j].Class)k=j;
if (k!=i)