随笔 - 2146  文章 - 19 评论 - 11846 阅读 - 1267万


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   万一  阅读(2057)  评论(1编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
历史上的今天:
2010-12-31 学用 ASP.Net 之 "字符串" (4): string 类的扩展方法
2009-12-31 GdiPlus[58]: 图像(十) IGPMetafile 特有的属性与方法
2009-12-31 GdiPlus[57]: 图像(九) IGPBitmap 特有的属性与方法
2008-12-31 C# 语法练习(6): 枚举
2008-12-31 显示系统托盘列表(并执行隐藏与显示) - 回复 "anybet" 的问题
2007-12-31 Addr 函数 - 获取对象指针
2007-12-31 AbstractErrorProc - 抽象错误处理的指针


点击右上角即可分享
微信分享提示