Delphi-按高、低、高、低顺序排序实数

Delphi-按高、低、高、低顺序排序实数,delphi,sorting,pascal,Delphi,Sorting,Pascal,假设我有数据 1,2,3,4,5,6 我想对这些数据进行排序,以便它能够输出 6152443 通过这种方式,数字被匹配,以便低数字与高数字配对 我会使用合并排序以数字顺序对其排序,然后拆分列表并根据此条件进行匹配吗 我试图对从数据文件读取的字符串网格中的实数数据进行排序;我有一个工作程序,可以按数字顺序对这些数据进行排序,但我不确定如何对其进行编码,使其按高、低、高、低进行排序 这是我的网格排序代码 procedure TForm1.SortGrid(Grid: TStringGrid; con

假设我有数据 1,2,3,4,5,6

我想对这些数据进行排序,以便它能够输出 6152443

通过这种方式,数字被匹配,以便低数字与高数字配对

我会使用合并排序以数字顺序对其排序,然后拆分列表并根据此条件进行匹配吗

我试图对从数据文件读取的字符串网格中的实数数据进行排序;我有一个工作程序,可以按数字顺序对这些数据进行排序,但我不确定如何对其进行编码,使其按高、低、高、低进行排序

这是我的网格排序代码

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
  • 末端计数器
这样,您可以有效地从数组中获取最后一个元素,并将其插入到1、3、5。。。位置,直到插入数组元素的最后一半

示例代码:

过程排序(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
Temp1:=6

系统移动:112345

艾瑞:612345

  • 指数1:2
Temp1:=5

系统移动:612234

AArray:615234

  • 指数1:4
Temp1:=4

系统移动:615233

AArray:615243

输出AArray:615243


对于记录结构,例如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数组中的索引。