如何在末尾用零排序整数数组?

时间:2018-01-06 16:33:47

标签: arrays sorting delphi integer delphi-10.1-berlin

我需要按整数字段对数组进行排序,其中1-n在开头排序,最后为0: 0,0,3,1,2 - > 1,2,3,0,0

我不知道如何一次性排序,所以我尝试了两种,但它没有产生正确的结果:

它确实在最后添加了零,但它弄乱了1-n个有序物品:

0,0,3,1,2 - > (第一类)0,0,1,2,3 - > (第二类)2,3,1,0,0

>>> l = [1, 2] * 10
>>> l
[1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2]

有没有办法在单个排序操作中进行这种排序?

2 个答案:

答案 0 :(得分:9)

尝试这一点,重点是在if-then-else阶梯之前,在普通情况之前处理特殊的0个案例。

  TArray.Sort<integer>(Arr, TComparer<integer>.Construct(function(const Left, Right: integer): Integer
    begin
    if (Left = 0) and (Right = 0) then
      Result := 0
    else if (Left = 0) then
      Result := 1
    else if (Right = 0) then
      Result := -1
    else if (Left < Right) then
      Result := -1
    else if (Left > Right) then
      Result := 1
    else
      Result := 0;
    end
    ));

简短的测试表明它运作正常。

答案 1 :(得分:4)

只需修复比较函数,使其将0视为大于任何值。

未测试:

TArray.Sort<integer>(Arr, TComparer<integer>.Construct(function(const Left, Right: integer): Integer
  begin
    if Left = Right then
      Result := 0
    else if ((Left <> 0) and (Left < Right)) or (Right = 0) then
      Result := -1
    else 
      Result := 1;
  end
  ));