JAVA的Collections类中shuffle方法模拟了“洗牌”动作可以对list列表进行随机排序。
如果一定要自己写,算法也很简单:
假设数组array长度为n。
用标准随机函数rand(n)生成[0, n-1]之间的一个随机数,将array[n-1]和array[rand(n)]交换,这样就把array[n-1]位置上的数确定了;
再将array[n-2]和array[rand(n-1)]交换,确定array[n-2]位置上的数;
再将array[n-3]和array[rand(n-2)]交换,确定array[n-3]位置上的数;
。。。。。。
最后将array[0]和array[rand(1)]交换(实际就是自己和自己交换),把array[0]确定了
这样生成的array[0..n-1]的数组是完全随机的乱序,且时间复杂度为O(n),空间复杂度为O(1)
 public int []  shuffle(int [] arr) {
int [] arr2 =new int[arr.length];
int count = arr.length;
int cbRandCount = 0;// 索引
int cbPosition = 0;// 位置
int k =0;
do {
runCount++;
Random rand = new Random();
int r = count - cbRandCount;
cbPosition = rand.nextInt(r);
arr2[k++] = arr[cbPosition];
cbRandCount++;
arr[cbPosition] = arr[r - 1];// 将最后一位数值赋值给已经被使用的cbPosition
} while (cbRandCount < count);
System.out.println("运算次数 = "+runCount);
return arr2;
}

最新文章

  1. Android开发环境的搭建
  2. JMeter Http测试计划
  3. 原生态js,鼠标按下后,经过了那些单元格
  4. 指针类型(C# 编程指南)
  5. 【风马一族_Python】 安装pip与Numpy
  6. mysql datetime 排序
  7. this,super关键字的使用
  8. Android--------使用gson解析json文件
  9. Unity 代码检测单击,双击,拖放
  10. VOOC还真算是OPPO的核心技术
  11. program_options
  12. LeetCode算法题-Move Zeroes(Java实现-三种解法)
  13. Windows下的两个缺陷
  14. 二进制小数及 IEEE 浮点表示
  15. shell脚本可以解决的问题
  16. python---django中form组件(2)自定制属性以及表单的各种验证,以及数据源的实时更新,以及和数据库关联使用ModelForm和元类
  17. FOR YOU
  18. [c++] final override keyword
  19. Katalon 学习笔记(一)
  20. Yii2 Api认证和授权(翻译)

热门文章

  1. offset Dimensions 详解
  2. java:LeakFilling (Linux)
  3. YAML基础知识及搭建一台简洁版guestbook
  4. PJzhang:从csdn到pipal密码分析工具
  5. OpenStack组件——Horizon Web界面管理服务
  6. 菜鸟系列Fabric——Fabric 1.2 单机部署(2)
  7. 关于js查找和筛选和循环的几种方式
  8. win32 API 笔记1
  9. Java小知识----POI事件模式读取Excel 2007
  10. 【转贴】Windows常用命令实例