procedure RadixSort(var R: array of Integer); const cMaxDigit = 4; //处理的最大位数 //0000~9999type PBin = ^TBin; //每个箱子的数据结构 TBin = record rData: Integer; //数据 rNext: PBin; //下一个箱子 end;var vBinList: array[0..9] of PBin; //箱子列表 procedure pAppendBin(mIndex: Integer; mData: Integer); //将数据放到指定位置的箱子中 var vBin: PBin; begin if vBinList[mIndex] = nil then begin New(vBinList[mIndex]); vBinList[mIndex].rNext := nil; vBinList[mIndex].rData := mData; end else begin vBin := vBinList[mIndex]; while vBin.rNext <> nil do vBin := vBin.rNext; New(vBin.rNext); vBin.rNext.rNext := nil; vBin.rNext.rData := mData; end; end; procedure pBinListToArr; //将箱子列表处理成数组 var vPos: Integer; vBin: PBin; I: Integer; begin vPos := Low(R); for I := 0 to 9 do begin vBin := vBinList[I]; while vBin <> nil do begin R[vPos] := vBin.rData; vBin := vBin.rNext; Inc(vPos); end; end; end; procedure pFreeBin(mIndex: Integer); //释放箱子的资源 var vBin: PBin; T: PBin; begin vBin := vBinList[mIndex]; while vBin <> nil do begin T := vBin; vBin := vBin.rNext; Dispose(T); end; vBinList[mIndex] := nil; end;var I: Integer; J: Integer; vDigit: Integer; begin FillChar(vBinList, SizeOf(vBinList), 0); //初始箱子列表 vDigit := 1; J := 1; while J <= cMaxDigit do begin for I := Low(R) to High(R) do pAppendBin(R[I] div vDigit mod 10, R[I]); pBinListToArr; for I := 0 to 9 do pFreeBin(I); vDigit := vDigit * 10; Inc(J); end; end;//Demo procedure TForm1.Button1Click(Sender: TObject); var A: array[0..100] of Integer; I: Integer; begin Randomize; Memo1.Clear; for I := Low(A) to High(A) do A[I] := Random(10000); RadixSort(A); for I := Low(A) to High(A) do Memo1.Lines.Add(IntToStr(A[I])); end;
//字符串~~ procedure StringRadixSort(var R: array of string); const cMaxLength = 4; //处理的最大长度type PBin = ^TBin; //每个箱子的数据结构 TBin = record rData: string; //数据 rNext: PBin; //下一个箱子 end;var vBinList: array[#0..#255] of PBin; //箱子列表 procedure pAppendBin(mIndex: Char; mData: string); //将数据放到指定位置的箱子中 var vBin: PBin; begin if vBinList[mIndex] = nil then begin New(vBinList[mIndex]); vBinList[mIndex].rNext := nil; vBinList[mIndex].rData := mData; end else begin vBin := vBinList[mIndex]; while vBin.rNext <> nil do vBin := vBin.rNext; New(vBin.rNext); vBin.rNext.rNext := nil; vBin.rNext.rData := mData; end; end; procedure pBinListToArr; //将箱子列表处理成数组 var vPos: Integer; vBin: PBin; I: Char; begin vPos := Low(R); for I := Low(vBinList) to High(vBinList) do begin vBin := vBinList[I]; while vBin <> nil do begin R[vPos] := vBin.rData; vBin := vBin.rNext; Inc(vPos); end; end; end; procedure pFreeBin(mIndex: Char); //释放箱子的资源 var vBin: PBin; T: PBin; begin vBin := vBinList[mIndex]; while vBin <> nil do begin T := vBin; vBin := vBin.rNext; Dispose(T); end; vBinList[mIndex] := nil; end;var I: Integer; J: Integer; C: Char; begin FillChar(vBinList, SizeOf(vBinList), 0); //初始箱子列表 J := 1; while J <= cMaxLength do begin for I := Low(R) to High(R) do pAppendBin((Copy(R[I], cMaxLength - J + 1, 1) + #0)[1], R[I]); pBinListToArr; for C := Low(vBinList) to High(vBinList) do pFreeBin(C); Inc(J); end; end;//Demo function RandomString(mChars: string; mLength: Integer): string; var I: Integer; begin Result := ''; if mChars = '' then Exit; for I := 1 to mLength do Result := Result + mChars[Random(Length(mChars)) + 1]; end; { RandomString }procedure TForm1.Button1Click(Sender: TObject); var A: array[0..100] of string; I: Integer; begin Randomize; Memo1.Clear; for I := Low(A) to High(A) do A[I] := RandomString('abcdefghicklmnopqrstuvwxyz', 4); StringRadixSort(A); for I := Low(A) to High(A) do Memo1.Lines.Add(A[I]); end;
procedure FloatRadixSort(var R: array of Extended); const cMaxDigit = 4; //处理的最大长度type PBin = ^TBin; //每个箱子的数据结构 TBin = record rData: Extended; //数据 rNext: PBin; //下一个箱子 end;var vBinList: array[0..9] of PBin; //箱子列表 procedure pAppendBin(mIndex: Integer; mData: Extended); //将数据放到指定位置的箱子中 var vBin: PBin; begin if vBinList[mIndex] = nil then begin New(vBinList[mIndex]); vBinList[mIndex].rNext := nil; vBinList[mIndex].rData := mData; end else begin vBin := vBinList[mIndex]; while vBin.rNext <> nil do vBin := vBin.rNext; New(vBin.rNext); vBin.rNext.rNext := nil; vBin.rNext.rData := mData; end; end; procedure pBinListToArr; //将箱子列表处理成数组 var vPos: Integer; vBin: PBin; I: Integer; begin vPos := Low(R); for I := Low(vBinList) to High(vBinList) do begin vBin := vBinList[I]; while vBin <> nil do begin R[vPos] := vBin.rData; vBin := vBin.rNext; Inc(vPos); end; end; end; procedure pFreeBin(mIndex: Integer); //释放箱子的资源 var vBin: PBin; T: PBin; begin vBin := vBinList[mIndex]; while vBin <> nil do begin T := vBin; vBin := vBin.rNext; Dispose(T); end; vBinList[mIndex] := nil; end;var I: Integer; J: Integer; vDigit: Extended; begin FillChar(vBinList, SizeOf(vBinList), 0); //初始箱子列表 vDigit := 0.0001; J := -cMaxDigit; while J <= cMaxDigit do begin for I := Low(R) to High(R) do pAppendBin(Trunc(R[I] / vDigit) mod 10, R[I]); pBinListToArr; for I := 0 to 9 do pFreeBin(I); vDigit := vDigit * 10; Inc(J); end; end;//Demo procedure TForm1.Button1Click(Sender: TObject); var A: array[0..100] of Extended; I: Integer; begin Randomize; Memo1.Clear; for I := Low(A) to High(A) do A[I] := Random(10000) + Random(10000) * 0.0001; FloatRadixSort(A); for I := Low(A) to High(A) do Memo1.Lines.Add(FloatToStr(A[I])); end;
to : zswangII(伴水清清)(一贴不灌,何以灌天下?) 太感谢你了。希望能和你多多交流。我的QQ :13470899 MSN : [email protected] 太感谢了。
http://student.zjzk.cn/course_ware/data_structure/web/paixu/paixu8.6.2.htm
这个网页是说基数排序的思路,可是我写不出来。很急的。
typedef digit[3] num; //3位自然数类型,假设低位存储在低下标,高位存储在高下标void Enum_Radix_Sort(num a[ ],int n)//利用计数实现基数排序,其中关键字为3位自然数,共有n个自然数
{
int number ,pos ;
num c[MAXSIZE];
for(j=0;j<3;j++) //依次对个位,十位和百位排序
{
for(i=0;i<n;i++) number[a[i][j]]++; //计数
for(pos[0]=0,i=1;i<n;i++)
pos[i]=pos[i-1]+num[i]; //把关键字的值映射为元素在排好的序列中的位置
for(i=0;i<n;i++) //构造有序数组c
c[pos[a[i][j]]++]=a[i];
for(i=0;i<n;i++)
a[i]=c[i];
}//for
}//Enum_Radix_Sort
分析:计数排序是一种稳定的排序方法.正因为如此,它才能够被用来实现基数排序.
const
cMaxDigit = 4; //处理的最大位数 //0000~9999type
PBin = ^TBin; //每个箱子的数据结构
TBin = record
rData: Integer; //数据
rNext: PBin; //下一个箱子
end;var
vBinList: array[0..9] of PBin; //箱子列表 procedure pAppendBin(mIndex: Integer; mData: Integer); //将数据放到指定位置的箱子中
var
vBin: PBin;
begin
if vBinList[mIndex] = nil then
begin
New(vBinList[mIndex]);
vBinList[mIndex].rNext := nil;
vBinList[mIndex].rData := mData;
end
else
begin
vBin := vBinList[mIndex];
while vBin.rNext <> nil do
vBin := vBin.rNext;
New(vBin.rNext);
vBin.rNext.rNext := nil;
vBin.rNext.rData := mData;
end;
end;
procedure pBinListToArr; //将箱子列表处理成数组
var
vPos: Integer;
vBin: PBin;
I: Integer;
begin
vPos := Low(R);
for I := 0 to 9 do
begin
vBin := vBinList[I];
while vBin <> nil do
begin
R[vPos] := vBin.rData;
vBin := vBin.rNext;
Inc(vPos);
end;
end;
end;
procedure pFreeBin(mIndex: Integer); //释放箱子的资源
var
vBin: PBin;
T: PBin;
begin
vBin := vBinList[mIndex];
while vBin <> nil do
begin
T := vBin;
vBin := vBin.rNext;
Dispose(T);
end;
vBinList[mIndex] := nil;
end;var
I: Integer;
J: Integer;
vDigit: Integer;
begin
FillChar(vBinList, SizeOf(vBinList), 0); //初始箱子列表 vDigit := 1;
J := 1;
while J <= cMaxDigit do
begin
for I := Low(R) to High(R) do
pAppendBin(R[I] div vDigit mod 10, R[I]);
pBinListToArr;
for I := 0 to 9 do pFreeBin(I);
vDigit := vDigit * 10;
Inc(J);
end;
end;//Demo
procedure TForm1.Button1Click(Sender: TObject);
var
A: array[0..100] of Integer;
I: Integer;
begin
Randomize;
Memo1.Clear;
for I := Low(A) to High(A) do A[I] := Random(10000);
RadixSort(A);
for I := Low(A) to High(A) do Memo1.Lines.Add(IntToStr(A[I]));
end;
你的例子只是对数字进行排序。那如果要对字符还有浮点数也进行排序,那应该如果改呢。
很感谢你给出的代码。谢谢!希望你继续关注我的问题。
to: zswangII(伴水清清)(一贴不灌,何以灌天下?)
如果排字符就要有255个箱子才行。请各位高手关注。
procedure StringRadixSort(var R: array of string);
const
cMaxLength = 4; //处理的最大长度type
PBin = ^TBin; //每个箱子的数据结构
TBin = record
rData: string; //数据
rNext: PBin; //下一个箱子
end;var
vBinList: array[#0..#255] of PBin; //箱子列表 procedure pAppendBin(mIndex: Char; mData: string); //将数据放到指定位置的箱子中
var
vBin: PBin;
begin
if vBinList[mIndex] = nil then
begin
New(vBinList[mIndex]);
vBinList[mIndex].rNext := nil;
vBinList[mIndex].rData := mData;
end
else
begin
vBin := vBinList[mIndex];
while vBin.rNext <> nil do
vBin := vBin.rNext;
New(vBin.rNext);
vBin.rNext.rNext := nil;
vBin.rNext.rData := mData;
end;
end;
procedure pBinListToArr; //将箱子列表处理成数组
var
vPos: Integer;
vBin: PBin;
I: Char;
begin
vPos := Low(R);
for I := Low(vBinList) to High(vBinList) do
begin
vBin := vBinList[I];
while vBin <> nil do
begin
R[vPos] := vBin.rData;
vBin := vBin.rNext;
Inc(vPos);
end;
end;
end;
procedure pFreeBin(mIndex: Char); //释放箱子的资源
var
vBin: PBin;
T: PBin;
begin
vBin := vBinList[mIndex];
while vBin <> nil do
begin
T := vBin;
vBin := vBin.rNext;
Dispose(T);
end;
vBinList[mIndex] := nil;
end;var
I: Integer;
J: Integer;
C: Char;
begin
FillChar(vBinList, SizeOf(vBinList), 0); //初始箱子列表 J := 1;
while J <= cMaxLength do
begin
for I := Low(R) to High(R) do
pAppendBin((Copy(R[I], cMaxLength - J + 1, 1) + #0)[1], R[I]);
pBinListToArr;
for C := Low(vBinList) to High(vBinList) do pFreeBin(C);
Inc(J);
end;
end;//Demo
function RandomString(mChars: string; mLength: Integer): string;
var
I: Integer;
begin
Result := '';
if mChars = '' then Exit;
for I := 1 to mLength do
Result := Result + mChars[Random(Length(mChars)) + 1];
end; { RandomString }procedure TForm1.Button1Click(Sender: TObject);
var
A: array[0..100] of string;
I: Integer;
begin
Randomize;
Memo1.Clear;
for I := Low(A) to High(A) do
A[I] := RandomString('abcdefghicklmnopqrstuvwxyz', 4);
StringRadixSort(A);
for I := Low(A) to High(A) do Memo1.Lines.Add(A[I]);
end;
const
cMaxDigit = 4; //处理的最大长度type
PBin = ^TBin; //每个箱子的数据结构
TBin = record
rData: Extended; //数据
rNext: PBin; //下一个箱子
end;var
vBinList: array[0..9] of PBin; //箱子列表 procedure pAppendBin(mIndex: Integer; mData: Extended); //将数据放到指定位置的箱子中
var
vBin: PBin;
begin
if vBinList[mIndex] = nil then
begin
New(vBinList[mIndex]);
vBinList[mIndex].rNext := nil;
vBinList[mIndex].rData := mData;
end
else
begin
vBin := vBinList[mIndex];
while vBin.rNext <> nil do
vBin := vBin.rNext;
New(vBin.rNext);
vBin.rNext.rNext := nil;
vBin.rNext.rData := mData;
end;
end;
procedure pBinListToArr; //将箱子列表处理成数组
var
vPos: Integer;
vBin: PBin;
I: Integer;
begin
vPos := Low(R);
for I := Low(vBinList) to High(vBinList) do
begin
vBin := vBinList[I];
while vBin <> nil do
begin
R[vPos] := vBin.rData;
vBin := vBin.rNext;
Inc(vPos);
end;
end;
end;
procedure pFreeBin(mIndex: Integer); //释放箱子的资源
var
vBin: PBin;
T: PBin;
begin
vBin := vBinList[mIndex];
while vBin <> nil do
begin
T := vBin;
vBin := vBin.rNext;
Dispose(T);
end;
vBinList[mIndex] := nil;
end;var
I: Integer;
J: Integer;
vDigit: Extended;
begin
FillChar(vBinList, SizeOf(vBinList), 0); //初始箱子列表 vDigit := 0.0001;
J := -cMaxDigit;
while J <= cMaxDigit do
begin
for I := Low(R) to High(R) do
pAppendBin(Trunc(R[I] / vDigit) mod 10, R[I]);
pBinListToArr;
for I := 0 to 9 do pFreeBin(I);
vDigit := vDigit * 10;
Inc(J);
end;
end;//Demo
procedure TForm1.Button1Click(Sender: TObject);
var
A: array[0..100] of Extended;
I: Integer;
begin
Randomize;
Memo1.Clear;
for I := Low(A) to High(A) do A[I] := Random(10000) + Random(10000) * 0.0001;
FloatRadixSort(A);
for I := Low(A) to High(A) do Memo1.Lines.Add(FloatToStr(A[I]));
end;
太感谢你了。希望能和你多多交流。我的QQ :13470899
MSN : [email protected]
太感谢了。