【问题标题】:Implementing QuickSort With middle element as Pivot使用中间元素作为 Pivot 实现快速排序
【发布时间】:2016-01-13 06:10:23
【问题描述】:

我尝试编写了一个以中间元素为轴心的快速排序代码。

我写的很成功。

但 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);

谢谢:)

【问题讨论】:

    标签: java pivot quicksort


    【解决方案1】:

    您必须在第一个堆栈调用中发送枢轴值,并且枢轴+1 作为第二个堆栈调用的较​​低索引。 您还必须将 left 的值设置为 i+1,然后您的代码将给出正确的输出

    【讨论】:

      【解决方案2】:

      你必须在分区方法中将返回值更改为left+1。

      试试这个程序:

      import java.io.*;
      public class QuickSort {
      
      public int partion(int[] a, int l, int h) {
      
          int middle = (h+l)/2;
          //System.out.println(middle);
          int pivot = a[middle];
          int i = l;
          int j = h;
      
          while (i <= j) {
              while (a[i] < pivot) i++;
              while (a[j] > pivot) j--;
              if (i <= j) {
                  swap(a, i, j);
                  i++;
                  j--;
                
              }
          }
         // swap(a,i,j);
          System.out.println((i+j)/2);
          return i-1;
      }
      
      public void quick(int[] a, int l, int h) {
              if (l<h) {
                  int pi = partion(a, l, h);
                  System.out.println(pi);
                  if (l < pi - 1)
                      quick(a, l, pi+1);
                  if (pi < h)
                      quick(a, pi+1, h);
              }
          }
      
      public void swap(int[] a, int l, int h){
          int temp=a[l];
          a[l]=a[h];
          a[h]=temp;
      }
      
      public static void main(String[] args) {
          int[] a = {10,80,30,90,40,50,70};
          int l=0;
          int h=a.length-1;
      
          QuickSort q =new QuickSort();
          q.quick(a,0,h);
          System.out.println(" Sorted Array : ");
          for(int e :a){
             System.out.print(e+" , ");
          }
        }
      }
      

      【讨论】:

        【解决方案3】:

        您可以选择数组中最左边的元素,也可以选择任何随机元素作为枢轴。

        查看wikipedia page on quicksort 了解有关选择支点的更多详细信息

        【讨论】:

        • 他要选择中间元素作为枢轴,不是第一个也不是最后一个!
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-03-29
        • 2019-11-23
        • 1970-01-01
        • 1970-01-01
        • 2015-05-04
        • 2021-04-19
        • 1970-01-01
        相关资源
        最近更新 更多