1.目的:将数组以随机的顺序重新排序,类似洗牌的过程
2.用途用于快速排序或者任何以划分为基础的排序中,目的是减少最坏可能性发生的概率。
3.想法1:给数组的每一个元素产生一个随机的数字作为键,然后使用排序算法,排列数字,即可以完成shuffling
缺点:需要排序的开销
4.想法2:在第i次循环,在0到i之间均匀随机的取整数r,然后交换a[i]和a[r]
可以做到在线性时间里完成shuffling
package com.cx.sort; public class Shuffling { public static void sort(Comparable[] a) { int N=a.length; for(int i=1;i<N;i++) { //第i次迭代,随机找r int r=(int)(Math.random()*(i+1)); exch(a, i, r); } } private static boolean less(Comparable v,Comparable w) { return v.compareTo(w)<0; } private static void exch(Comparable[] a,int i ,int j ) { Comparable t=a[i]; a[i]=a[j]; a[j]=t; } private static void show(Comparable[] a) { for(int i=0;i<a.length;i++) { System.out.print(a[i]+" "); } System.out.println(); } public static void main(String[] args) { String a[]= {"s","o","r","t","e","x","a","m","p","l","e"}; show(a); sort(a); show(a); } }