随笔 - 2047  文章 - 71 评论 - 10629 trackbacks - 253

提示1: 点击 标题 可进入首页;   提示2: 从搜索引擎中搜索 万一 可迅速找到这里.
昵称:万一
园龄:4年3个月
荣誉:推荐博客
粉丝:349
关注:34

随笔分类(2499)

随笔档案(2051)

积分与排名

  • 积分 - 4148339
  • 排名 - 4

最新评论


2011 年的最后一天了...

混合排序 -> 搅乱、重新洗牌; 以 Integer 动态数组为例.

//两个辅助函数 Swap、ToStr, 分别用于交换数组元素和呈现为字符串
procedure Swap(var Arr: TArray<Integer>; a,b: Cardinal);
var
  tmp: Integer;
begin
  if (a >= Length(Arr)) or (b >= Length(Arr)) or (a = b) then Exit;
  tmp := Arr[a];
  Arr[a] := Arr[b];
  Arr[b] := tmp;
end;

function ToStr(const Arr: TArray<Integer>): string;
var
  n: Integer;
begin
  for n in Arr do
    Result := Result + IntToStr(n) + sLineBreak;
end;
//-----------------------------------------------------------------

{1、简单反排序}
procedure SimpleShuffle(var Arr: TArray<Integer>);
var
  r,i: Integer; //分别用作随机索引、遍历索引
begin
  for i := 0 to Length(Arr) - 1 do
  begin
    r := Random(Length(Arr));
    Swap(Arr, i, r);
  end;
end;

{2、好的反排序}
procedure GoodShuffle(var Arr: TArray<Integer>);
var
  r,i: Integer;
begin
  for i := Length(Arr) - 1 downto 0 do
  begin
    r := Random(i + 1);
    if r <> i then Swap(Arr, i, r);
  end;
end;

{测试}
procedure TForm1.Button1Click(Sender: TObject);
var
  arr1,arr2: TArray<Integer>;
begin
  arr1 := TArray<Integer>.Create(0, 1, 2, 3, 4, 5, 6, 7, 8, 9); //
  arr2 := Copy(arr1);                                           //

//  SimpleShuffle(arr2);
  GoodShuffle(arr2);

  Memo1.Text := ToStr(arr1);
  Memo2.Text := ToStr(arr2);
end;

posted on 2011-12-31 13:30 万一 阅读(513) 评论(1) 编辑 收藏

FeedBack:
#1楼 2012-01-02 08:49 bangzg      
万老师你好,最近忙不?
小弟有一个问题请教下万老师,有一份EXCEL表格,数据格式如下:
品名 厂家 需求数量 库存总数 厂家A 厂家B 厂家C 厂家D
糖果 厂家A 50 500
糖果 厂家C 500 0
香烟 厂家A 100 2000
香烟 厂家B 200 0
香烟 厂家C 200 0
香烟 厂家D 500 0

要求如下:库存总数-品名相同的需求数量总和>0,则除最后一个厂家赋值为库存总数-需求数量总和的余数,其他厂家依次赋值为各自的需求数量;
库存总数-品名相同的需求数量总和<0,则把库存总数依次减去需求数量,优先满足厂家A,厂家B,厂家C,厂家D的顺序赋值

 回复 引用 查看