Java将一数组乱序排列(洗牌,时间复杂度为O(n))

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;  
}
 

猜你喜欢

转载自blog.csdn.net/qq_37139060/article/details/82634027