Java打乱数组排序(洗牌算法)
给定一个数组,要求把数组内元素的顺序随机打乱,然后输出,主要是要保证效率。
这其实是个洗牌算法,首先从所有元素中随机选取一个与第一个元素进行交换,然后在第二个之后选择一个元素与第二个交换,直到最后一个元素。这样能确保每个元素在每个位置的概率都是1/n。
public class Main{
public static void main(String[] args){
int[] arr = [0,1,2,3,4,5,6,7];
int length = arr.length;
for(int i=0;i<length;i++){
int iRandNum = (int)(Math.random() * length);
int temp = arr[iRandNum];
arr[iRandNum] = arr[i];
arr[i] = temp;
}
//输出
for(int i=0;i<length;i++){
System.out.print(arr[i] + " ");
}
}
}
使用Arrays.sort()打乱顺序
sort() 会调用容器的compare函数对比两个比较对象,如果是正值则进行交换,如果是负值,则不交换。
public class Main{
public static void main(String[] args){
int[] arr = [0,1,2,3,4,5,6,7];
Comparator cmp = new MyComparator();
Arrays.sort(arr, cmp);
//输出
for(int i=0;i<arr.length;i++){
System.out.print(arr[i] + " ");
}
}
}
class MyComparator implements Comparator<Integer>{
@Override
public int compare(Integer o1, Integer o2) {
return Math.random() < 0.5? 1 : -1;
}
}