2.1 shuffle sort(洗牌)

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);
    }
}
原文地址:https://www.cnblogs.com/sunnyCx/p/8149900.html