有没有做过这样的算法啊:类似数据表的Order by 字段1,字段2...?高分相送。这是我一个快考试的同学火烧眉才告诉我,他急。特来求救,详细

maoke000 2002-07-09 09:45:21
下面是题目:

“任取一表,编制程序用基数排序的方法排列其中记录”

实现环境:visual basic ,visual c++,visual foxpro,Java均可

基数排序原理:
“在一般情况下,假设文件F有N个记录F=(R1,R2。。。RN)且每个记录R1中含有 d 个排序码(K i1,Ki2,.....Kid)有序是指:对于文件中任意两个记录Ri,Rj(1<=i<=j<=n)都满足词典次序有序关系:(Ki1,Ki2,....Kid)<Kj1,Kj2,....Kjd)其中K1称为最高位排序码,Kd称为最低位排序码。为实现多排序码排序,通常有两种方法。

第一种是:先对最高位排序码K1进行排序将序列分成若干个子序列,每个子序列中的记录都具有相同的K1值,然后分别就每个子序列K2进行排序,按K2值不同再分成若干更小的子序列,依次重复,直至对Kd-1进行之后得到的每一子序列中的记录都具有相同的关键码(K1,K2。。。Kd-1)而后分别每个子序列对Kd 进行排序,最后将各子序列按次序叠在一起成为一个有序文件。这种方法称之为最高位优先法;

第二种方法是从最低位排序码Kd起进行排序,然后再对高一位的关键码Kd-1进行排序,依次重复,直至对K1进行排序之后便得到一个有序排列,这种是LSD法

有的逻辑排序码可以看成由若干排序码复合而成。如,排序码是数值,且其值都在0<=k<=999范围内,则可把每一个十进数字看成一个排序码,则K有3个关键码(K1K2K3)组成,其中K1是百位数,K2是十位数,K3是个位数。若排序码是5个字母组成的单词,则可看成是5个排序码(K1K2K3K4K5)组成其中Kj是(自左至右)的第J个字母。由于如此分解而得的每个排序码Kj都在相同的范围内,则选用LSD方便,从最低位排序码排起,按排序码的不同值将文件中的记录分配到RD个子序列中后收集之。如此重复D次

要求:将每个字段定为排序码,即关键码进行排序。
例如有一学生情况表,字段有“姓名,学号,性别”等。按LSD进行排序,若按“姓名,学号,性别"的顺序来排,表中记录会是怎样,若按“学号,姓名,性别”的顺序来排,表中的记录会是怎样;若按“性别,学号,姓名”的顺序来排,表中的记录会是怎样........

注意:不要利用索引
...全文
134 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
maoke000 2002-08-05
  • 打赏
  • 举报
回复
procedure TFmSort.SpeedButton1Click(Sender: TObject);
var i:integer;
begin
if not OpenDialog1.Execute then
Exit;

Table1.DatabaseName := ExtractFilePath(OpenDialog1.FileName);
Table1.TableName := ExtractFileName(OpenDialog1.FileName);
Table1.Active := true;

LstField.Items.Clear;
LstFieldValid.Items.Clear;
//读字段项
for i := 0 to Table1.FieldCount - 1 do
if Table1.FieldDefs.Items[i].DataType = ftString then
LstField.Items.Add( Table1.FieldDefs.Items[i].DisplayName);

//写字段
SGRD.ColCount := LstField.Items.Count + 1;
DGRD.ColCount := LstField.Items.Count + 1;

for i := 0 to LstField.Items.Count - 1 do
begin
SGRD.Cells[i+1,0] := LstField.Items.Strings[i];
DGRD.Cells[i+1,0] := LstField.Items.Strings[i];
end;

//读数据到表格
SGRD.RowCount := 2;
DGRD.RowCount := 2;
SGRD.RowCount := Table1.RecordCount + 1;
DGRD.RowCount := Table1.RecordCount + 1;
for i := 0 to SGRD.RowCount do
begin
SGRD.Cells[0,i+1] := IntToStr(i + 1);
DGRD.Cells[0,i+1] := IntToStr(i + 1);
end;

for i := 1 to sGRD.ColCount - 1 do
begin
Table1.First;
while not Table1.Eof do
begin
SGRD.Cells[i,Table1.RecNo] := Table1.FieldByName(SGRD.Cells[i,0]).AsString;
DGRD.Cells[i,Table1.RecNo] := Table1.FieldByName(SGRD.Cells[i,0]).AsString;
Table1.Next;
end;
end;
Table1.Close;
end;

procedure TFmSort.SpeedButton2Click(Sender: TObject);
var i,nFirst,nSecond:integer;
sFirst,sSecond:string;
begin
if LstFieldValid.Items.Count = 0 then
Exit;

CopyData(SGRD,DGRD);
if LstFieldValid.Items.Count = 1 then
begin
sFirst := LstFieldValid.Items.Strings[0];
nFirst := SGRD.Rows[0].IndexOf(sFirst) ;
Sort(DGRD.Cols[nFirst],nil);
Exit;
end;

for i := 0 to LstFieldValid.Items.Count - 2 do
begin
sFirst := LstFieldValid.Items.Strings[i];
sSecond := LstFieldValid.Items.Strings[i + 1];
nFirst := SGRD.Rows[0].IndexOf(sFirst) ;
nSecond := sGRD.Rows[0].IndexOf(sSecond) ;
Sort(DGRD.Cols[nFirst],DGRD.Cols[nSecond]);
end;
end;

procedure TFmSort.Button1Click(Sender: TObject);
var s:string;
begin
s := LstField.Items.Strings[LstField.ItemIndex];
if LstFieldValid.Items.IndexOf(s) = -1 then
LstFieldValid.Items.Add(s);
end;

procedure TFmSort.LstFieldValidKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if Key = VK_DELETE then
LstFieldValid.Items.Delete(LstFieldValid.ItemIndex);
end;

procedure TFmSort.LstFieldValidDblClick(Sender: TObject);
begin
if LstFieldValid.ItemIndex >= 0 then
LstFieldValid.Items.Delete(LstFieldValid.ItemIndex);
end;

end.
maoke000 2002-08-05
  • 打赏
  • 举报
回复
procedure Sort(FirstStr,SecondStr:TStrings);

procedure QuickSort(AStrArr,BStrArr:TStrings;iLo,iHi:integer);
var
Lo,Hi:integer;
Mid,T:string;
begin
Lo := iLo;
Hi := iHi;
Mid := AStrArr.Strings[(Lo + Hi) div 2];
repeat
while AStrArr[Lo] < Mid do Inc(Lo);
while AStrArr[Hi] > Mid do Dec(Hi);
if Lo <= Hi then
begin
T := AStrArr[Lo];
AStrArr[Lo] := AStrArr[Hi];
AStrArr[Hi] := T;
if BStrArr <> nil then
begin
T := BStrArr[Lo];
BStrArr[Lo] := BStrArr[Hi];
BStrArr[Hi] := T;
end;
Inc(Lo);
Dec(Hi);
end;
until Lo > Hi;
if Hi > iLo then QuickSort(AStrArr,BStrArr, iLo, Hi);
if Lo < iHi then QuickSort(AStrArr,BStrArr, Lo, iHi);
end;

var sLast:string;
i,nFirst:integer;
begin
QuickSort(FirstStr,SecondStr,1, FirstStr.Count-1);
sLast := FirstStr.Strings[1];
nFirst := 1;
for i := 2 to FirstStr.Count - 1 do
if FirstStr.Strings[i] <> sLast then
begin
if i > nFirst + 1 then
QuickSort(SecondStr,nil,nFirst, i);
nFirst := i;
sLast := FirstStr.Strings[i];
end;

if i > nFirst + 1 then
QuickSort(SecondStr,nil,nFirst, FirstStr.Count - 1);
end;

procedure TFmSort.CopyData(S,D:TStringGrid);
var i,j:integer;
begin
for i := 0 to D.RowCount - 1 do
D.Rows[i].Clear;

for i := 0 to D.ColCount - 1 do
D.Cols[i].Clear;

for i := 0 to D.RowCount - 1 do
for j := 0 to D.ColCount - 1 do
D.Cells[j,i] := S.Cells[j,i];
end;
maoke000 2002-08-05
  • 打赏
  • 举报
回复
我来解答:

unit SortField;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ExtCtrls, Db, DBTables, Grids, Buttons;

type
TFmSort = class(TForm)
Panel1: TPanel;
Splitter1: TSplitter;
Panel2: TPanel;
SGrd: TStringGrid;
DGrd: TStringGrid;
Splitter2: TSplitter;
Panel3: TPanel;
Panel4: TPanel;
SpeedButton1: TSpeedButton;
LstField: TListBox;
Panel5: TPanel;
SpeedButton2: TSpeedButton;
OpenDialog1: TOpenDialog;
Table1: TTable;
LstFieldValid: TListBox;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Panel6: TPanel;
Label4: TLabel;
Memo1: TMemo;
SpeedButton3: TSpeedButton;
procedure SpeedButton1Click(Sender: TObject);
procedure SpeedButton2Click(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure LstFieldValidKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
procedure LstFieldValidDblClick(Sender: TObject);
private
procedure CopyData(S,D:TStringGrid);
{ Private declarations }
public
{ Public declarations }
end;

var
FmSort: TFmSort;

procedure Sort(FirstStr,SecondStr:TStrings);

implementation

{$R *.DFM}
tangwen829 2002-07-23
  • 打赏
  • 举报
回复
NO TIME STUDY

QUESTION TOO LONG??
maoke000 2002-07-10
  • 打赏
  • 举报
回复
我一直都在等待,苦苦地等待,等待高手的出现!!!

W w A IIII T T TT T T
w w w A A II T TT T
w w w w A A II TT
w w w w AAAAAAA II TT
w w A A IIII TTTT
maoke000 2002-07-10
  • 打赏
  • 举报
回复
看来是没有人能应战了。
maoke000 2002-07-10
  • 打赏
  • 举报
回复
是不是问题难了点?我想应该不是吧。

我一直都在等待,苦苦地等待,等待高手的出现!!!

W w A III T T TT T T
w w w A A I T TT T
w w w w A A I TT
w w w w A A A A I TT
w w A A III TTTT



5,930

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧