【问题标题】:C.A.R. Hoare Quicksort implementation in Java车。 Java 中的 Hoare 快速排序实现
【发布时间】:2020-06-17 15:09:10
【问题描述】:

我正在尝试在整数数组上实现快速排序。

我的所有方法都正常运行,除了分区。分区从获取中点开始,然后排序,第一,中间,最后。

出现在 {1,6,5,4,3,2,7}

然后在此之后的某个地方,我得到 {1, 2, 5, 3, 4, 7, 6} 作为最终结果

谁能告诉我在哪里可以进行调整?

预期输出应为 {1,2,3,4,5,6,7}

import java.util.Arrays;

public class Test {
    public static void main(String[]args) {


    int [] a = {7,6,5,4,3,2,1};

    quickSort(a);

    System.out.println(Arrays.toString(a));

}

    public static void quickSort( int [] a) {
        quickSort(a,0,a.length - 1);
    }

    public static void quickSort(int [] a,int start,int end) { 
        if(start<end) {
            int pivotIndex = partition(a, start, end);
            quickSort(a,start,pivotIndex-1); // sort left partition
            quickSort(a,pivotIndex+1,end); // sort right partition
        }

    }

    public static  int partition(int [] a, int start, int end) {
        int mid =midpoint(start,end);
        sortFirstMiddleLast(a,start,mid,end);


        swap(a,start,end-1);
        int pivotIndex = end -1;
        int pivotValue = pivotIndex;

        int indexFromLeft = start +1;
        int indexFromRight = end -2;
        boolean done = false;
        while (!done) {
            while (a[indexFromLeft]<a[pivotValue]) {
                indexFromLeft++;
            }
            while (a[indexFromRight]>a[pivotValue]) {
                indexFromRight--;
            }
            if (indexFromLeft < indexFromRight) {
                swap(a,indexFromLeft,indexFromRight);
                indexFromLeft++;
                indexFromRight--;
            }
            else {
                done=true;
            }

        }
        swap(a,pivotIndex,indexFromLeft);
        pivotIndex=indexFromLeft;
        return pivotIndex;
    }

    public static void sortFirstMiddleLast(int [] a, int start, int mid, int end) {
        if (a[start]>a[mid]) {
            swap(a,start,mid);
        }
        else if (a[mid]>a[end]) {
            swap(a,mid,end);
        }
        else if (a[start]>a[end]) {
            swap(a,start,end);
        }
        else if(a[start] > a[mid]) {
            swap (a,start,mid);
        }

    }
    private static void swap(int[] a, int first, int second) {
        int temp = a[first];
        a[first] = a[second];
        a[second] = temp;
    }



    private static int midpoint(int first, int last) {
        return first + (last - first) / 2;
    }
}

【问题讨论】:

    标签: java quicksort


    【解决方案1】:

    检查是否 start == 0 在行之后执行之前:

    int indexFromLeft = start +1;
    int indexFromRight = end -2;
    

    在该条件下终止递归。

    【讨论】:

    • 得到 [1, 2, 5, 3, 4, 7, 6]
    【解决方案2】:

    试试这个

           swap(a,start,end-1);
                int pivotIndex = end -1; // removed -1
                int pivotValue = pivotIndex;
    
                int indexFromLeft = start +1; // removed +1
                int indexFromRight = end -2;  // removed -2 
    
      public static  int partition(int [] a, int start, int end) {
                int mid =midpoint(start,end);
                sortFirstMiddleLast(a,start,mid,end);
    
    
                swap(a,start,end-1);
                int pivotIndex = end ;
                int pivotValue = pivotIndex;
    
                int indexFromLeft = start ;
                int indexFromRight = end;
                boolean done = false;
                while (!done) {
                    while (a[indexFromLeft]<a[pivotValue]) {
                        indexFromLeft++;
                    }
                    while (a[indexFromRight]>a[pivotValue]) {
                        indexFromRight--;
                    }
                    if (indexFromLeft < indexFromRight) {
                        swap(a,indexFromLeft,indexFromRight);
                        indexFromLeft++;
                        indexFromRight--;
                    }
                    else {
                        done=true;
                    }
    
                }
                swap(a,pivotIndex,indexFromLeft);
                pivotIndex=indexFromLeft;
                return pivotIndex;
            }
    
    

    【讨论】:

    • 有效!谢谢。知道如何用数组对象解决同样的问题吗?
    • 试试看,为什么?有什么不同?这如何解决问题?
    【解决方案3】:

    如果你使用下面创建的类,你不会有任何问题。

    class QuickSort{
    int partition(int arr[], int low, int high)
    {
        int pivot = arr[high]; 
        int i = (low-1); 
        for (int j=low; j<high; j++)
        {
    
            if (arr[j] <= pivot)
            {
                i++;
    
    
                int temp = arr[i];
                arr[i] = arr[j];
                arr[j] = temp;
            }
        }
    
    
        int temp = arr[i+1];
        arr[i+1] = arr[high];
        arr[high] = temp;
    
        return i+1;
    }
    
    void sort(int arr[], int low, int high)
    {
        if (low < high)
        {
    
            int pi = partition(arr, low, high);
    
            sort(arr, low, pi-1);
            sort(arr, pi+1, high);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2018-05-27
      • 2018-12-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-29
      • 2017-02-18
      • 1970-01-01
      相关资源
      最近更新 更多