2010-02-23 4 views
2

Так что я пытаюсь создать метод quicksort, однако он не сортируется правильно. Heres мой вход и выход
в исходном массиве:
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,0Quicksort не сортировка

Я попытался изменить цикл для 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; 
    } 

ответ

7

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

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 ошибки в исходном коде:

  • Ошибка одноразовую на границе контура
  • Вы используете неправильный индекс, чтобы получить опорный элемент в цикле
  • Вы поменялись местами элементы на неправильные показатели после цикла
+0

Передача параметра pivotIndex в качестве параметра бесполезна, было бы более эффективно вычислять его внутри раздела (и, кстати, избегать всех вещей, связанных с перестановкой) ... в любом случае положение поворота все равно возвращается в раздел. – kriss

+0

Я не хотел слишком сильно менять свой исходный код; Я просто хотел исправить любые ошибки, которые вижу. Рефакторинг свопа был сделан для ясности, а не эффективности. – polygenelubricants

0

изменения

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

в

for(int i = left; i < right; i++) 
+0

, что не работал, мой выход теперь: 0,0 20,0 30,0 40,0 80,0 10,0 60,0 90,0 70,0 50,0 – Raptrex

+0

последняя замена должна быть между позами и правом, а не между позами и pivotIndex – ariel

+0

и внутри цикла , значение поворота находится в 'a [right]', а не 'a [pivotIndex]'. – polygenelubricants