Быстрая сортировка не сортировка - PullRequest
2 голосов
/ 23 февраля 2010

Итак, я пытаюсь создать метод быстрой сортировки, однако он не сортируется должным образом.Вот мой ввод и вывод
Исходный массив:
80,0 10,0 50,0 70,0 60,0 90,0 20,0 30,0 40,0 0,0
Сортированный массив:
0,0 30,0 20,0 80,0 40,0 60,0 70,0 10,0 90,0 50,0

Iпопытался изменить цикл for на for(int i = left; i < right; i++)
, но теперь вывод:
0,0 20,0 30,0 40,0 80,0 10,0 60,0 90,0 70,0 50,0

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

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

    private static int partition(double [] a, int left,int right,int pivotIndex)
    {
        double temp = a[pivotIndex];
        a[pivotIndex] = a[right];
        a[right] = temp;
        int pos = left;//represents boundary between small and large elements
        for(int i = left; i < right-1; i++)
        {
            if (a[i] <= a[pivotIndex])
            {
                double temp2 = a[i];
                a[i] = a[pos];
                a[pos] = temp2;
                pos++;
            }
        }
        double temp3 = a[pivotIndex];
        a[pivotIndex] = a[pos];
        a[pos] = temp3;
        return pos;
    }

Ответы [ 2 ]

8 голосов
/ 23 февраля 2010

Вот что вы хотите сделать:

private static void swap(double[] a, int i, int j) {
    double t = a[i];
    a[i] = a[j];
    a[j] = t;
}

private static int partition(double [] a, int left,int right,int pivotIndex)
{
    swap(a, pivotIndex, right);
    int pos = left;//represents boundary between small and large elements
    for(int i = left; i < right; i++)
    {
        if (a[i] < a[right])
        {
            swap(a, i, pos);
            pos++;
        }
    }
    swap(a, right, pos);
    return pos;
}

Я сделал код более понятным с помощью вспомогательного swap метода. У вас было 3 ошибки в исходном коде:

  • Одноразовая ошибка на границе цикла
  • Вы используете неверный индекс для получения элемента pivot в цикле
  • Вы поменяли местами элементы с неправильными индексами после цикла
0 голосов
/ 23 февраля 2010

изменение

for(int i = left; i < right-1; i++)

до

for(int i = left; i < right; i++)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...