二进制插入排序算法重复输出

时间:2017-01-21 08:02:19

标签: algorithm pascal

  for i:= 1 to 5 do
      begin
        temp := data[i];
        bawah := 1;
        atas := i;
        k:=i;   
        while (bawah < atas) do
          begin
          tengah := (bawah + atas) div 2;

          if (temp <= data[tengah]) then
              atas := tengah
          else
              bawah := tengah + 1;
          end;

          while (k > atas) do
            begin
              data[k] := data[k - 1];
              data[atas] := temp;
              k-=1;
            end;
      end;

问题是,排序的数组并不完全 结果是这样的:

here

1 个答案:

答案 0 :(得分:1)

您过早地执行以下任务:

data[atas] := temp;

在循环的下一次迭代中,k-1的值将变为atas,因此错误的值将被复制到data[k],从而导致重复并丢失原始值data[atas]中的值。

因此将该行移出循环:只有在完成移位操作时才需要执行该行:

      while (k > atas) do
        begin
          data[k] := data[k - 1];
          k-=1;
        end;
      data[atas] := temp;