Java中乱序排序很常见,给定一个数组,要求把数组内元素的顺序随机打乱,然后输出。
有以下几种方法:
1.使用Collections.shuffle实现
List<String> User = new ArrayList<String>(); User.add("a"); User.add("b"); User.add("c"); User.add("d"); User.add("e"); //使用Collections.shuffle实现乱序排序 Collections.shuffle(User); System.out.println(User);
2.使用交换
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] + " "); }
3.使用randmom
/** * 实现乱序排序 * @param arr * @return */ public static int [] shuffle(int [] arr) { int [] arr2 =new int[arr.length]; int count = arr.length; int cbRandCount = 0;// 索引 int cbPosition = 0;// 位置 int k =0; int runCount=0; do { runCount++; Random rand = new Random(); int r = count - cbRandCount; cbPosition = rand.nextInt(r); arr2[k++] = arr[cbPosition]; cbRandCount++; // 将最后一位数值赋值给已经被使用的cbPosition arr[cbPosition] = arr[r - 1]; } while (cbRandCount < count); System.out.println("运算次数:"+runCount); return arr2; }
4.完整代码如下:
public class ListSortTest { //演示一下打乱排序 public static void main(String[] args) { List<String> User = new ArrayList<String>(); User.add("a"); User.add("b"); User.add("c"); User.add("d"); User.add("e"); //1.使用Collections.shuffle实现乱序排序 Collections.shuffle(User); System.out.println(User); //2.使用交换 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.println(arr[i] + " "); } //3.使用random shuffle(arr); } /** * 实现乱序排序 * @param arr * @return */ public static int [] shuffle(int [] arr) { int [] arr2 =new int[arr.length]; int count = arr.length; int cbRandCount = 0;// 索引 int cbPosition = 0;// 位置 int k =0; int runCount=0; do { runCount++; Random rand = new Random(); int r = count - cbRandCount; cbPosition = rand.nextInt(r); arr2[k++] = arr[cbPosition]; cbRandCount++; // 将最后一位数值赋值给已经被使用的cbPosition arr[cbPosition] = arr[r - 1]; } while (cbRandCount < count); System.out.println("运算次数:"+runCount); return arr2; } }
5.测试结果如下图: