【问题标题】:How do I take a random number as a pivot in a quicksort?如何在快速排序中将随机数作为枢轴?
【发布时间】:2019-09-24 19:02:37
【问题描述】:

所以我测试了这段代码,如果枢轴是数组的最后一个元素,它可以工作,但是如果我尝试在枢轴是随机元素的情况下运行它,结果数组不包含原始数组的某些元素

public static void quickSort(int[] S){
    int n = S.length;
    if(n<2)
        return;
    int random = (int)(Math.random() * n);

    int pivot = S[random];
    int m = 0, k = n;
    int[] temp = new int[n];

    for(int i = 0; i < n-1; i++){
        if(S[i] < pivot)
            temp[m++] = S[i];
        else if(S[i] > pivot)
            temp[--k] = S[i];
    } 
    int[] L = Arrays.copyOfRange(temp,0,m);
    int[] E = new int[k-m];
    Arrays.fill(E,pivot);
    int[] G = Arrays.copyOfRange(temp,k,n);
    quickSort(L);
    quickSort(G);
    System.arraycopy(L,0,S,0,m);
    System.arraycopy(E,0,S,m,k-m);
    System.arraycopy(G,0,S,k,n-k);
}

此代码输出 1 1 2 2 2 43

【问题讨论】:

  • 附带说明,使用不言自明的变量名作为良好的编程习惯。
  • 你没有。您将随机 element 作为枢轴。数据中必须存在枢轴值。

标签: java sorting random quicksort


【解决方案1】:

循环限制不正确:i &lt; n - 1。因此,您忽略了最后一个元素,如果它不大于枢轴,它就会出现在错误的部分。

要修复它,您还应该包含循环中的最后一个元素:i &lt;= n - 1

【讨论】:

  • @BeastMaster64:如果答案有帮助,您可以将其标记为有帮助。
猜你喜欢
  • 1970-01-01
  • 2018-11-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多