type
Ta=record
i1:integer;
i2:integer;
end;
var
a:array[0..10] of Ta;
//a 中的資料為
0 1258
2 102
1 99
0 2
......
先對 i1 進行升序,然后進行 i2 進行升序
結果是: 0 2
0 1258
1 99
2 102
....
多謝
uj5u.com熱心網友回復:
大致代碼,如下,你修改下。
procedure TForm1.Button1Click(Sender: TObject);
var
i, j, N: integer;
begin
//i1 Ascend
for i := 0 to Length(a) - 2 do
for j := 0 to Length(a) - 2 - i do
if a[j].i1 > a[j + 1].i1 then
begin
N := a[j].i1;
a[j].i1 := a[j + 1].i1;
a[j + 1].i1 := N;
end;
//i2 Descend
for i := 0 to Length(a) - 2 do
for j := 0 to Length(a) - 2 - i do
if a[j].i2 < a[j + 1].i2 then
begin
N := a[j].i2;
a[j].i2 := a[j + 1].i2;
a[j + 1].i2 := N;
end;
end;
uj5u.com熱心網友回復:
用的是冒泡排序法uj5u.com熱心網友回復:
To :feiba7288你這樣的結果應該是錯誤的,會變成
0 2
0 99
1 102
....
傻辦法是第二次排序的時候進行分段,比如0的單獨排,1的單獨排,要多一次回圈
uj5u.com熱心網友回復:
TO Andwo,我只是告訴他一個基本的排序方法而已,至于實際效果想怎樣,他可以變通修改下代碼。uj5u.com熱心網友回復:
To 樓主,自己多體會下這個演算法,多寫代碼練習才能學成是自己東西。uj5u.com熱心網友回復:
多練習才可以學到東西uj5u.com熱心網友回復:
procedure TForm1.btn1Click(Sender: TObject);
type
Ta=record
i1:integer;
i2:integer;
end;
var
a:array[0..3] of Ta;
nTa,mTa:Ta;
i,j:integer;
strTmp:string;
begin
//初始化陣列內容
nTa.i1:=0;
nTa.i2:=1258;
a[0]:=nTa;
nTa.i1:=2;
nTa.i2:=102;
a[1]:=nTa;
nTa.i1:=1;
nTa.i2:=99;
a[2]:=nTa;
nTa.i1:=0;
nTa.i2:=2;
a[3]:=nTa;
//對陣列以i1升序排列
for i:=0 to high(a) do
begin
nTa:=a[i];
for j:=i+1 to high(a) do
begin
mTa:=a[j];
if mTa.i1<nTa.i1 then
begin
a[j]:=nTa;
nTa:=mTa;
end;
end;
a[i]:=nTa;
end;
//對陣列以i2升序排列
for i:=0 to high(a) do
begin
nTa:=a[i];
for j:=i+1 to high(a) do
begin
mTa:=a[j];
if mTa.i2<nTa.i2 then
begin
a[j]:=nTa;
nTa:=mTa;
end;
end;
a[i]:=nTa;
end;
//列印排列結果
strTmp:='';
for i:=0 to high(a) do
begin
showmessage(inttostr(i));
strTmp:=strTmp+inttostr(a[i].i1)+','+inttostr(a[i].i2)+chr(13);
end;
showmessage(strTmp);
end;
uj5u.com熱心網友回復:
對陣列以i2升序排列時,判斷下i1是否相同,相同的才應該替換uj5u.com熱心網友回復:
是的,應該是i1為主,其次才以i2排序
uj5u.com熱心網友回復:
兩個32位integer組合成一個64位int64,排序后再拆開來再懶的辦法是兩個32位integer組合成20位字串加到TStringList中,排序后再拆開來
st.clear;
for i:=low(a) to high(a) do st.add(format('%.10d%.10d'),[a[i].i1,a[i].i2]));
st.sort;
for i:=low(a) to high(a) do begin a[i].i1:=strtoint(copy(st[i],1,10)); a[i].i2:=strtoint(copy(st[i],11,20)); end;
uj5u.com熱心網友回復:
插入法排序
procedure TForm1.btn3Click(Sender: TObject);
var
intTmp:integer;
i,j,k:integer;
begin
intS:=Gettickcount;
for i:=0 to high(x)-1 do
begin
j:=i+1;
if x[j]<x[i] then
begin
intTmp:=x[j];
k:=i;
while ((x[k]>intTmp) and (k>=0)) do
begin
x[k+1]:=x[k];
k:=k-1;
end;
x[k+1]:=intTmp;
end;
end;
end;
uj5u.com熱心網友回復:

之前編程不太熟悉的時候.
用的時將二維轉一維.
因為在記憶體中存放是連續的.
所以直接用指標.然后排序就和一維排序是一樣的
uj5u.com熱心網友回復:
當需要排序的元素個數越多時,排序方法的效率就越明顯以下是三種排序方法的測驗結果
uj5u.com熱心網友回復:
希爾排序法
procedure ShellSort(var abc: array of Integer);
var
i, j: Integer;
h: Integer;
Temp: Integer;
Ninth: Integer;
begin
h := 1;
Ninth := High(abc) div 9;
while (h <= Ninth) do
h := (h * 3) + 1;
while (h > 0) do
begin
for i := h to High(abc) do
begin
Temp := abc[i];
j := i;
while (j >= (0 + h)) and (Temp < abc[j - h]) do
begin
abc[j] := abc[j - h];
dec(j, h);
end;
abc[j] := Temp;
end;
h := h div 3;
end;
end;
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/101750.html
標籤:語言基礎/算法/系統設計
上一篇:設計模式綜述
