0

私はデータ1,2,3,4,5,6を持っているとしましょう

このデータを並べ替えて、6 1 5 2 4 3 を出力するようにしたい

このように、数値が一致するため、低い数値と高い数値がペアになります

マージソートを使用して番号順にソートし、リストを分割してこの条件に従って一致させますか?

データ ファイルから読み取った文字列グリッドで実数データを並べ替えようとしています。これらのデータを数値順にソートする作業プログラムがありますが、高、低、高、低の順にソートするようにコーディングする方法がわかりません

これは私のグリッドソートのコードです

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;
4

4 に答える 4

2

上記のサンプル データから、入力配列が事前に並べ替えられていると想定しています。

[手元にコンパイラがないことに注意してください。そのため、実行して動作を確認する必要があります。多少の調整が必要になる場合があります。]

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;

これがどのように(すべきか)段階的に機能するかです

入力配列: 123456

  • インデックス 1: 0

温度 1 := 6

System.Move: 112345

配列: 612345

  • インデックス1: 2

温度 1 := 5

System.Move: 612234

配列: 615234

  • インデックス1: 4

温度 1 := 4

System.Move: 615233

配列: 615243

出力配列: 615243


TPerson などのレコード構造の場合、次のようになります。

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;
于 2013-05-12T16:43:52.403 に答える
1

データを昇順に並べ替えます。次に、次のインデックスを使用して値を選択します: 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;
于 2013-05-12T14:17:38.470 に答える