实现QuickSort使用中间元素作为Pivot

时间:2015-10-14 23:36:47

标签: java pivot quicksort

我尝试用Quickort编写代码,中间元素为pivot。

我成功写了一篇。

但Pivot的财产是:

左侧的元素小于枢轴,右侧的元素更大。

我无法在以下代码中实现此目的。

private static void QuickSortAlgorithm(int[] a, int i, int n) 
{
    if(i<n)
    {
        int part = partition(a,i,n);

        QuickSortAlgorithm(a, i, part-1);

        QuickSortAlgorithm(a, part, n);
    }
}

private static int partition(int[] a, int i, int n) 
{
    int pivot = (i+n)/2;

    int left = i;

    int right = n;
    while(left<=right)
    {
        while(a[left]<a[pivot]){
            left++;
        }

        while(a[right]>a[pivot])
        {
            right--;
        }

        if(left<=right)
        {
            swap(a,left,right);
            left++;
            right--;
        }
    }
    return left;

}

主要方法:

    int a[]={5,7,3,9,1};
    int n = a.length;
    QuickSortAlgorithm(a,0,n-1);
    System.out.println(Arrays.toString(a));

我怀疑是:

我发送左边作为我的分区索引。

但是,当我递归调用QuickSortAlgorithm()

我发送了i to part-1part to n;

我应该发送什么作为分区索引以便

我可以这样调用:这样可以满足枢轴属性吗?

    QuickSortAlgorithm(a, i, part-1);

    QuickSortAlgorithm(a, part+1, n);

谢谢:)

2 个答案:

答案 0 :(得分:0)

您必须在包括第一个堆栈调用中发送数据透视值,并向第二个堆栈调用中的较低索引发送数据透视表+1。 您还必须将left的值设置为i + 1,这样您的代码才能给出正确的输出

答案 1 :(得分:-3)

您可以选择数组中最左边的元素,也可以选择任意随机元素作为您的支点。

查看wikipedia page on quicksort,了解有关选择数据透视的更多详情