C .AR реализация Hoare Quicksort в Java - PullRequest
2 голосов
/ 05 марта 2020

Я пытаюсь реализовать QuickSort для массива целых.

Все мои методы работают правильно, кроме раздела. Раздел начинается с получения средней точки, затем упорядочивается, сначала, середина, последняя.

Выходит на {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;
    }
}

Ответы [ 3 ]

0 голосов
/ 05 марта 2020

Попробуйте это

       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;
        }

0 голосов
/ 05 марта 2020

Если вы используете класс, созданный ниже, у вас не возникнет никаких проблем.

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);
    }
}
0 голосов
/ 05 марта 2020

проверьте, если start = ​​= 0 перед выполнением далее после строк:

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

завершить рекурсии при этом условии.

...