Delphi-按高、低、高、低顺序排序实数
假设我有数据 1,2,3,4,5,6 我想对这些数据进行排序,以便它能够输出 6152443 通过这种方式,数字被匹配,以便低数字与高数字配对 我会使用合并排序以数字顺序对其排序,然后拆分列表并根据此条件进行匹配吗 我试图对从数据文件读取的字符串网格中的实数数据进行排序;我有一个工作程序,可以按数字顺序对这些数据进行排序,但我不确定如何对其进行编码,使其按高、低、高、低进行排序 这是我的网格排序代码Delphi-按高、低、高、低顺序排序实数,delphi,sorting,pascal,Delphi,Sorting,Pascal,假设我有数据 1,2,3,4,5,6 我想对这些数据进行排序,以便它能够输出 6152443 通过这种方式,数字被匹配,以便低数字与高数字配对 我会使用合并排序以数字顺序对其排序,然后拆分列表并根据此条件进行匹配吗 我试图对从数据文件读取的字符串网格中的实数数据进行排序;我有一个工作程序,可以按数字顺序对这些数据进行排序,但我不确定如何对其进行编码,使其按高、低、高、低进行排序 这是我的网格排序代码 procedure TForm1.SortGrid(Grid: TStringGrid; con
procedure TForm1.SortGrid(Grid: TStringGrid; const SortCol: Integer;
//sorting the string grid
const datatype: Integer; const ascending: boolean);
var
i: Integer;
tempgrid: TStringGrid;
list: array of Integer;
begin
tempgrid := TStringGrid.create(self);
with tempgrid do
begin
rowcount := Grid.rowcount;
ColCount := Grid.ColCount;
fixedrows := Grid.fixedrows;
end;
with Grid do
begin
setlength(list, rowcount - fixedrows);
for i := fixedrows to rowcount - 1 do
begin
list[i - fixedrows] := i;
tempgrid.rows[i].assign(Grid.rows[i]);
end;
Mergesort(Grid, list, SortCol + 1, datatype, ascending);
for i := 0 to rowcount - fixedrows - 1 do
begin
rows[i + fixedrows].assign(tempgrid.rows[list[i]])
end;
row := fixedrows;
end;
tempgrid.free;
setlength(list, 0);
end;
按升序对数据进行排序。然后使用以下索引选择值:0,n-1,1,n-2 在伪代码中,算法如下所示:
Sort;
lo := 0;
hi := n-1;
while lo<=hi do
begin
yield lo;
inc(lo);
if lo>hi then break;
yield hi;
dec(hi);
end;
procedure SerratedSort(var A: array of TPerson);
var
s: Integer;
i: Integer;
t: TPerson;
begin
s := Length(A);
i := 0;
while i < s do begin
t := A[s - 1];
System.Move(A[i], A[i + 1], (s - i + 1) * SizeOf(TPerson));
A[i] := t;
i := i + 2;
end;
end;
排序;
lo:=0;
hi:=n-1;
而洛希则打破;
产量高;
12月(hi);
结束;
首先,使用您想要的任何算法按降序对数字进行排序(我在示例中使用了冒泡排序)
然后,如果数组中有n个元素:
- 将计数器设置为从1到(n第2部分)
- 获取最后一个元素并将其存储在临时变量(tmp)
- 将所有元素向右移动一个位置,从(计数器-1)*2+1开始。这将覆盖最后一个元素,但将其存储在tmpvar中
- 将数组[(计数器-1)*2+1]元素设置为tmp
- 末端计数器
过程排序(var-AArray:Double数组);
变量
C1,C2:整数;
tmp:Double;
枢轴:整数;
开始
对于C1:=低(AArray)到高(AArray)-1 do
对于C2:=C1+1至高(AArray)do
如果AArray[C1]
演示上述给定解决方案的示例程序:
program Project1;
{$APPTYPE CONSOLE}
const
Count = 12;
type
TValues = array[0..Count - 1] of Double;
const
Input: TValues = (1,2,4,9,13,14,15,23,60,100,101,102);
var
I: Integer;
Output: TValues;
procedure ShowValues(Caption: String; Values: TValues);
var
I: Integer;
begin
Write(Caption);
for I := 0 to Count - 2 do
Write(Round(Values[I]), ', ');
WriteLn(Round(Values[Count - 1]));
end;
begin
if Odd(Count) then
WriteLn('Cannot compute an odd number of input values')
else
begin
WriteLn('Program assumes sorted input!');
ShowValues('Input: ', Input);
for I := 0 to (Count div 2) - 1 do
begin
Output[2 * I] := Input[I];
Output[2 * I + 1] := Input[Count - 1 - I];
end;
ShowValues('Output: ', Output);
end;
ReadLn;
end.
根据上面提供的示例数据,我假设输入数组是预排序的 [请注意,我手头没有编译器,因此您必须运行它并查看它是否正常工作--可能需要稍微修改一下。]
procedure SerratedSort(var AArray: array of Double);
var
Length1: Integer;
Index1: Integer;
Temp1: Double;
begin
Length1 := Length(AArray);
Index1 := 0;
while Index1 < Length1 do begin
Temp1 := AArray[Length1 - 1];
System.Move(AArray[Index1], AArray[Index1 + 1], (Length1 - Index1 + 1) * SizeOf(Double));
AArray[Index1] := Temp1;
Index1 := Index1 + 2;
end;
end;
procedure-SerratedSort(var-AArray:Double数组);
变量
长度1:整数;
Index1:整数;
Temp1:Double;
开始
长度1:=长度(AArray);
Index1:=0;
当Index1
下面是它应该如何一步一步地工作
输入AArray:123456
- 指数1:0
- 指数1:2
- 指数1:4
对于记录结构,例如TPerson,它将如下所示:
Sort;
lo := 0;
hi := n-1;
while lo<=hi do
begin
yield lo;
inc(lo);
if lo>hi then break;
yield hi;
dec(hi);
end;
procedure SerratedSort(var A: array of TPerson);
var
s: Integer;
i: Integer;
t: TPerson;
begin
s := Length(A);
i := 0;
while i < s do begin
t := A[s - 1];
System.Move(A[i], A[i + 1], (s - i + 1) * SizeOf(TPerson));
A[i] := t;
i := i + 2;
end;
end;
procedure SerratedSort(var A:TPerson数组);
变量
s:整数;
i:整数;
t:TPerson;
开始
s:=长度(A);
i:=0;
当我开始的时候
t:=A[s-1];
系统移动(A[i],A[i+1],(s-i+1)*SizeOf(TPerson));
A[i]:=t;
i:=i+2;
结束;
结束;
如果你想按高-低-高-低的顺序对数字进行排序,你不应该从初始数据中得到6 1 5 2 4 3吗?我只是很快地写了出来,没有思考,但是是的,按照这个顺序我把你的问题转回来了。原来的问题很好,已经回答了。如何处理重复的数字?我忘了提到我在编程方面的知识非常少,所以我不知道怎么做that@Nathan:那么您需要有人为您编写完整的程序。满足奇数长度数组的要求很简单。我如何在string grid您应该使用网格数据填充动态数组并将其传递给Sort()函数,然后清除网格并使用Sort()返回的数据重新填充它。很抱歉,我不知道该如何做。您是否将数据存储在字符串网格中?这通常是个坏主意。我认为他目前的问题比他存储数据的方式更大:)首先,在我看来,使用网格本身对数据进行排序是草率的编程。您应该使用中间数组。第二,请不要不断改变问题。我不追求效率,这是我知道的唯一方法,因为我没有编程经验。这里没有人谈论效率。编程方面的经验不足并不是定义问题时缺乏能力的借口。您的第一次尝试是正确的,因为它需要一个代码片段来从算法上解决一个可概括的问题。现在你把它变成了“为我写我的程序”。请不要那样做。你得到了解决方案。使其适应您的TPerson记录结构——或者使用该TPerson数组中的索引。