shuffle()打乱数组的实现
在做快排时,为了保证快排nlogn,会打乱数组。
然后想着怎么实现,用随机数需要一点技巧。
注意:Collection.shuffle()只能打乱集合,没法打乱数组
思路:
在数组长度n内生成一个随机数r,复制arr1的r到arr2上。
arr1的最后一个数组替换到r上,n–。重复进行
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
   | import java.util.Random;
 
 
 
 
  public class MyShuffle {
      public static int[] myShuffle(int[] arr) {         int[] arr2 = new int[arr.length];         Random rand = new Random();         int lengthNow = arr.length;         int arrIndex = rand.nextInt(lengthNow);         int arr2Index = 0;         while (lengthNow > 0) {             arr2[arr2Index++] = arr[arrIndex];             arr[arrIndex] = arr[lengthNow - 1];             lengthNow--;             if(lengthNow == 0) break;             arrIndex = rand.nextInt(lengthNow);         }         arr = arr2;         return arr;     }
      public static void main(String[] args) {         int[] arr = {1, 2, 3, 4, 5, 6};         arr = myShuffle(arr);         for (int i = 0; i < arr.length; i++) {             System.out.println(arr[i]);         }     } }
   | 
 
小坑:
之前采用的void 传参arr进去修改,arr = arr2 。后来输出的时候,发现出现重复,问题在于传的参是对象的拷贝。
在其中能修改,但是赋值却只是赋值给了形参。
可以用全局变量解决(static)