【问题标题】:QSort with Random Partition带有随机分区的 QSort
【发布时间】:2016-11-21 02:22:57
【问题描述】:

以下 qsort 的实现来自《算法基础》一书,因此被认为是正确的。下面是我在 Java 中的实现。这没用。问题是随机选择分区时,生成的分区不正确。我希望有人能告诉我我做错了什么:

鲍勃

import java.util.*;
public class qsort {
    public static void main(String []args)
    {
        int []a1 = { 1, 2, 3, -4, -5, 6, 7 };
        sort( 0, a1.length-1, a1 );
        printarray (a1 );

    }
static void sort( int low, int high, int []a )
{
    if ( low < high ) {
        int p = part( low, high, a);
        System.out.println( " p = " + p );
        printarray( a, low, p );
        System.out.println();
        sort( low, p-1, a);
        printarray( a, p, high );
        System.out.println();
        sort( p+1, high, a);
    }
}
static int part(int low, int high, int [] S) {
        int i;
        int j;
        int randspot;
        int pivotitem;
        int pivotpoint;
        Random random = new Random(456);
        randspot = random.nextInt(high-low +1)+low;
        pivotitem = S[randspot];
        j = low;
        for (i = low + 1; i <= high; i++)
            if (S[i] < pivotitem){
                j++;
                int temp = S[j];
                S[j] = S[i]; //exchanges S[i] and S[j]
                S[i] = temp;
            }
        pivotpoint = j;
        int temp = S[low];
        S[low] = S[pivotpoint];
        S[pivotpoint] = temp;
        return pivotpoint;
    }

static void printarray (int [] Test){
    for (int i = 0; i<Test.length; i++){
        if (i !=0 && i%10==0)
            System.out.println();
        System.out.print(Test[i]+ "\t");

    }
}
static void printarray (int [] Test, int low, int high){
    for (int i = low; i<high; i++)
        System.out.print(Test[i]+ "\t");
    }
}

【问题讨论】:

  • 您应该熟悉调试器。
  • 一个错误的例子可以帮助我们理解你所面临的问题
  • 提示:增加索引变量时要密切注意

标签: java algorithm sorting qsort


【解决方案1】:

您需要先将枢轴元素与低索引元素交换,然后再进行其他操作。检查我在以下代码块中添加的代码。

static int part(int low, int high, int [] S) {
    int i;
    int j;
    int randspot;
    int pivotitem;
    int pivotpoint;
    Random random = new Random(456);
    randspot = random.nextInt(high-low +1)+low;
    System.out.println( " p = " + randspot );
    System.out.println( " value = " + S[randspot] );
    pivotitem = S[randspot];
    //---------------Start code block
    int temp1 = S[randspot];
    S[randspot] = S[low];
    S[low] = temp1;
    //---------------End code block
    j = low;
    for (i = low + 1; i <= high; i++)
        if (S[i] < pivotitem){
            j++;
            int temp = S[j];
            S[j] = S[i]; //exchanges S[i] and S[j]
            S[i] = temp;
        }
    pivotpoint = j;
    int temp = S[low];
    S[low] = S[pivotpoint];
    S[pivotpoint] = temp;
    return pivotpoint;
}

【讨论】:

    猜你喜欢
    • 2014-12-30
    • 2012-12-09
    • 1970-01-01
    • 2016-04-15
    • 1970-01-01
    • 2014-03-18
    • 2022-01-09
    • 1970-01-01
    • 2020-12-27
    相关资源
    最近更新 更多