zoukankan      html  css  js  c++  java
  • java将一数组乱序排列

    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)
     1 public int []  shuffle(int [] arr) {  
     2  int [] arr2 =new int[arr.length];  
     3  int count = arr.length;  
     4  int cbRandCount = 0;// 索引  
     5  int cbPosition = 0;// 位置  
     6  int k =0;  
     7  do {  
     8   runCount++;  
     9   Random rand = new Random();  
    10   int r = count - cbRandCount;  
    11   cbPosition = rand.nextInt(r);   
    12   arr2[k++] = arr[cbPosition];  
    13   cbRandCount++;  
    14   arr[cbPosition] = arr[r - 1];// 将最后一位数值赋值给已经被使用的cbPosition  
    15  } while (cbRandCount < count);  
    16  System.out.println("运算次数  = "+runCount);  
    17  return arr2;  
    18 }  
  • 相关阅读:
    js 为表格增加行 动态
    百度测试新搜索结果页面 改进灵感来自谷歌?
    多线程程序中使用fork的问题
    C++ struct和class的区别
    J2SE 5 HotSpot JVM 解释
    并行优化、xvout
    C++基础:纯虚函数和抽象类
    C++的四种cast
    logcat过滤输出
    C++虚函数和纯虚函数(2)
  • 原文地址:https://www.cnblogs.com/zjm-1/p/9035772.html
Copyright © 2011-2022 走看看