关于多关键字排序的问题

来源:百度知道 编辑:UC知道 时间:2024/05/25 11:52:43
【问题描述】

多关键字的排序有一定的使用范围。例如:在进行高考分数处理时,除了需要对总分进行排序外。不同的专业单科分数的要求不同,因此尚需在总分相同的情况下,按用户提出的单科分数的次序要求排除考生录取的次序。

【基本要求】

(1) 假设待排序的记录数不超过10000,表中记录的关键字数不超过5,各个关键字的范围均为0至100。按用户给定的进行排序的关键词优先关系,输出排序结果。

(2) 约定按LSD法进行多关键字的排序。在对各个关键字进行排序时采用两种策略:其一是利用稳定的内部排序法,其二是利用“分配”和“收集”的方法;并综合比较这两种策略。

(3) 按照MSD策略进行排序 ,并同(2)中的两种排序策略进行综合比较。

(4) 以两种方式产生数据,一是从文件old.txt中读取,二是系统随机生成数据,并且将产生的数据保存文件new.txt中,到将按照多关键字排序的结果保存到结果文件Out.txt中。

【测试数据】

从文件old.txt中读取的数据自己在程序运行前建立,系统随机生成数据,在程序运行由随机数产生器生成。
问题用c语言和数据结构解决

我用pascal语言编了一个多关键字快速排序的程序,要求先输入行数、列数,再输入数据,程序按从最左列到最右列的优先顺序排序,关键字的个数最大值可以在常量中调试。
program dgjzpx;
const
maxn=100000;
kind=100;
type
data=array[1..maxn,1..kind] of longint;
line=array[1..kind] of longint;
var
a:data;
n,m,i,j:byte;
function ok(x,y:line; k:longint):boolean;
begin
ok:=false;
if k>m then exit;
if x[k]<y[k]
then exit(true)
else if x[k]=y[k]
then ok:=ok(x,y,k+1)
else;
end;
procedure qsort(var a:data; s,t:longint);
var
i,j:longint;
m,temp:line;
begin
i:=s; j:=t; m:=a[(i+j) div 2];
while i<j do
begin
while ok(a[i],m,1) do inc(i);
while ok(m,a[j],1) do dec(j);
if i<=j then
begin
temp:=a[i]; a[i]:=a[j]; a[j]:=temp;
inc(i); dec(j);
end;
end;
if s<j then qsort(a,s,j