大家好!
征求纯的随机排序!  要求在把指定的数组元素随机排序!例如 1-100.
要求算法效率要高!因为要排序的数据库可能会很大。

解决方案 »

  1.   


    public class T {
    public static void main(String args[]) {
    int count = 3000000;
    int[] array = new int[count];
    for (int i = 0; i < count; i++) {
    array[i] = i + 1;
    }
    long start = System.currentTimeMillis();
    int[] randomArr = getRandomArraay(array, count);
    // for (int i = 0; i < randomArr.length; i++)
    // System.out.println(i + ":" + randomArr[i]);
    long end = System.currentTimeMillis();
    System.out.println("Time: " + (end - start) + " ms");
    } public static int[] getRandomArraay(int[] originalArray, int number) {
    if (number > originalArray.length)
    return null;
    int[] result = new int[number];
    int n = originalArray.length;
    for (int i = 0; i < number; i++) {
    int t = (int) (Math.random() * n);
    result[i] = originalArray[t];
    originalArray[t] = originalArray[n - 1];
    n--;
    }
    return result;
    }
    }
    //1 million: 150ms
    //2 million: 310ms
    //3 million: 510ms
      

  2.   

    他的意思在检索数据时使用特定函数随机数据
    sqlServer中是:NewId()
    还有用order by也可以随机数据
      

  3.   

    Collections.shuffle(list)就可以自动打乱顺序了
      

  4.   

    java.util.Collections.shuffle()
    public static void shuffle(List<?> list)使用默认随机源对指定列表进行置换。所有置换发生的可能性都是大致相等的。
    前面描述中使用了不确定的词“大致”,因为随机源只是大致上独立选择位的无偏源。如果它是一个随机选择位的最佳源,那么算法将完全一致的选择置换。此实现向后遍历列表,从最后一个元素一直到第二个元素,将随机选择的元素重复交换到“当前位置”。元素是从列表的一部分随机选择的,该部分列表从第一个元素一直到当前位置(包括)。此方法以线性时间运行。如果指定列表没有实现 RandomAccess 接口并且是一个大型列表,则此实现在改组列表前将指定列表转储到数组中,并将改组后的数组转储回列表中。这避免了二次行为,该行为是原地改组一个“有序访问”列表引起的。 要求效率高的话,算法都不好
    8楼的算法随机选择有弊端,每次都要先从前10个选,选走后把最后面的再移到前10某个被移走的位置,中间的数据不能随机打乱,Collections.shuffle()也是为了保证效率高,所有置换发生的可能性都是大致相等的。
      

  5.   

    java.util.Collections.shuffle 的算法已经不算太差了,而且对于传入ArrayList这些是RandomAccess 的List来说,没有转换数组的问题。
    它说可能性大致相等是因为Math.random本身就只是一个固定的算法,只能保证可能性尽量均等
      

  6.   

    public static void main(String[] args) {
    int a[]=new int[20];
    int len=a.length;
    for(int i=0;i<len;i++)
    a[i]=i+1;
    for(int i=0;i<len;i++)
    {
    int t1=(int)Math.floor(Math.random()*len);
    int t2=(int)Math.floor(Math.random()*len);
    // System.out.println("t1="+t1+",t2="+t2);
    int temp=a[t1];
    a[t1]=a[t2];
    a[t2]=temp;
    }