随机排列数组
很多随机算法通过对给定的输入变换排列以使输入随机化。
(a) 第一种做法给每个元素随机赋值给一个优先级。
伪代码:
N= Arr.length
新建数组P[N]
For i=1 to N:
P[i]=random(1,N^3)///使得每个值尽可能唯一。
Sort Arr 用P的优先级
(b) 原址排列给定数组
伪代码:
N = Arr.length
for i=1 to N:
swap Arr[i] with Arr[Random(I,N)]
package sort;
import java.util.Arrays;
import java.util.Map;
import java.util.Random;
import java.util.TreeMap;
public class RandomArr {
public static void main(String[] args){
int[] arr = {4,8,3,78,56,45,89,67,90};
Pro(arr);
change(arr);
}
//使用优先级
public static void Pro(int[] arr){
Random rand = new Random();
int[] pro = new int[arr.length];
int max =(int) Math.pow(arr.length,3);
for(int i= 0;i<arr.length;i++){
pro[i] = rand.nextInt(max);
}
TreeMap<Integer,Integer> tm = new TreeMap<Integer,Integer>();
for(int i=0;i<pro.length;i++){
tm.put(pro[i], arr[i]);
}
int i=0;
for(Map.Entry<Integer,Integer> map:tm.entrySet()){
arr[i]=map.getValue();
i++;
}
System.out.println(Arrays.toString(arr));
}
//随机交换,洗牌策略
public static void change(int[] arr){
Random rand = new Random();
for(int i=0;i<arr.length;i++){
int temp = arr[i];
int num = i+rand.nextInt(arr.length-i);
arr[i] = arr[num];
arr[num]= temp;
}
System.out.println(Arrays.toString(arr));
}
}