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

Binary Insertion Sort Algorithm Duplicate Output

  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;

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

您执行以下作业太早了:

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;