请大侠指教,给个算法。
要求对数组中的值排序,然后输出原来值在排序中的位置。例如:
原来的数组值为:
A[0]=3
A[1]=4
A[2]=2
A[3]=0
A[4]=6
要求排序的时候,去掉0值。从1算起。输出结果如下:
A[0]=2
A[1]=3
A[2]=1
A[3]=0
A[4]=4请指教!谢谢!
要求对数组中的值排序,然后输出原来值在排序中的位置。例如:
原来的数组值为:
A[0]=3
A[1]=4
A[2]=2
A[3]=0
A[4]=6
要求排序的时候,去掉0值。从1算起。输出结果如下:
A[0]=2
A[1]=3
A[2]=1
A[3]=0
A[4]=4请指教!谢谢!
解决方案 »
- Delphi可否获取数据库的raiserror的错误级别代码
- 请问如何使用ZIP将文件压缩成EXE格式?
- 一个类继承多哥父类
- 如何将数据库中TBLOBfield的图片加入TimageLIst?
- 如何判断电脑多长时间没人操作
- Form上置有一Panel.Panel上又置有很多的shape(用来画表格),edit和listbox...
- 请问大家:一个ActivX的OCX文件在VB里注册安装后,可以出现在组件面板里。为什么Delphi里虽然提示安装成功,为什么在ActivX下,找不到这
- 给大家报告一个好消息啦!!!!
- Very 菜的问题——怎样才能启动一个另外的程序?
- 急救!!!关于udp控件!
- 关于使用delphi中Base64的问题,请大家帮我分析一下。
- 求助:在delphi的自定义函数中引用其它变量出错
unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;type
TForm1 = class(TForm)
Button1: TButton;
Memo1: TMemo;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;
myarr:array[0..4] of byte;
implementation{$R *.dfm}procedure TForm1.FormCreate(Sender: TObject);
begin
myarr[0]:=3;
myarr[1]:=2;
myarr[2]:=7;
myarr[3]:=9;
myarr[4]:=5;
end;procedure TForm1.Button1Click(Sender: TObject);
type
ARec=record
value,po:integer;
end;
var
Arr:array of ARec;
ResultArr:array of ARec;
temp:ARec;
i,j:integer;
begin
SetLength(arr,length(myarr));
SetLength(resultarr,length(myarr));
for i:=low(myarr) to high(myarr) do
begin
arr[i].value:=myarr[i];
arr[i].po:=i;
end;
for i:=low(arr) to high(arr)-1 do
for j:=low(arr) to high(arr)-1 do
if arr[j].value>arr[j+1].value then
begin
temp:=arr[j];
arr[j]:=arr[j+1];
arr[j+1]:=temp;
end;for i:=low(arr) to high(arr) do
memo1.Lines.Add('值:'+inttostr(arr[i].value)+' 下标:'+inttostr(arr[i].po));
setlength(arr,0);
setlength(resultarr,0);
end;end.
2,1,4,5,3数据:
myarr[0]:=3;
myarr[1]:=2;
myarr[2]:=7;
myarr[3]:=9;
myarr[4]:=5;
排序后的结果是:2,3,5,7,9
我要的结果是:
3在排序后的序列中在第2位
2在排序后的序列中在第1位
7在排序后的序列中在第4位
9在排序后的序列中在第5位
5在排序后的序列中在第3位其中要考虑重复数据和0的情况,0不参加排序。
不知道这样是否说明白了?
procedure TForm1.Button1Click(Sender: TObject);
var
tmp1 : array of array[1..2] of integer; //原来有数据,利用二维数组记录数据及下标
tmp2 : array of array[1..2] of integer; //排序后数据,利用二维数组记录数据新下标
i,j:integer;
t,t1:integer;
begin
if Memo1.Lines.Count <=0 then exit;
SetLength( tmp1, Memo1.Lines.Count); //按Memo1.Lines.Count设置数组长度
SetLength( tmp2, Memo1.Lines.Count);
for i:=0 to Memo1.Lines.Count-1 do //利用Memo1进行数据初始化tmp1,tmp2
begin
tmp1[i,1] := strtoint(Memo1.Lines[i]);
tmp1[i,2] := i;
tmp2[i,1] := strtoint(Memo1.Lines[i]);
tmp2[i,2] := i;
end;
for i:= Memo1.Lines.Count-1 downto 0 do //利用冒泡法进行排序
begin
for j:=0 to i do
begin
if tmp2[j,1]=0 then continue ; //进行比较时,若比较值为0则不进行排序
if tmp2[j+1,1]=0 then //进行比较时,被比较值为0时则与下一个被比较值进行比较
begin
if tmp2[j,1] > tmp2[j+2,1] then ]; // 比较值的大小
begin
t := tmp2[j,1];
t1 := tmp2[j,2]; tmp2[j,1] := tmp2[j+2,1 //进行冒泡
tmp2[j+2,1] := t ; tmp2[j,2] := tmp2[j+2,2]; //同时更换下标
tmp2[j+2,2] := t1;
end ;
end
else //若比较值和被比较值都不为0则进行比较
begin
if tmp2[j,1] > tmp2[j+1,1] then //同上
begin
t := tmp2[j,1];
t1 := tmp2[j,2]; tmp2[j,1] := tmp2[j+1,1]; //同上
tmp2[j+1,1] := t ; tmp2[j,2] := tmp2[j+1,2];//同上
tmp2[j+1,2] := t1;
end;
end;
end;
end; for i:= 0 to Memo1.Lines.Count-1 do
begin
Memo2.Lines.Add(inttostr(tmp2[i,1])+','+inttostr(tmp2[i,2]) );//输出排序后数据,
tmp1[tmp2[i,2],2] := i; //反向查找原有数据在排序后数据中的下标
end; for i:= 0 to Memo1.Lines.Count-1 do
begin
Memo3.Lines.Add(inttostr(tmp1[i,1])+','+inttostr(tmp1[i,2]) ); //输出原有数据在排序后的下标
end;
end;
myarr[0]:=3;
myarr[1]:=0;
myarr[2]:=5;
myarr[3]:=9;
myarr[4]:=5;
为例子,说一下结果输出结果应该是什么
myarr[0]:=3;
myarr[1]:=0;
myarr[2]:=5;
myarr[3]:=9;
myarr[4]:=5;
为例子,说一下结果输出结果应该是什么
1
0
2
3
2