2012-06-26 5 views
0

Я пытаюсь написать функцию быстрой сортировки для сортировки в пределах от 10 до 1 000 000 номеров. Он выполняет итерацию через все, но не сортирует, просто печатает вектор как есть.quicksort not sorting C++

По какой-то причине он слишком быстро выходит из линии while. Тестовый ввод, который я использую: (3 6 2 5 1 7 9 10 4 8). И это выход: (1 2 6 5 3 7-10 4 8)

int main() 
{ 
    std::cout << "Which file would you like to sort?\n"; 
    std::cin >> file; 

    std::ifstream in(file.c_str()); 

    // Read all the ints from in: 
    std::copy(std::istream_iterator<int>(in), std::istream_iterator<int>(), 
      std::back_inserter(numbers)); 

    int max = numbers.size(); 
    quickSort(numbers, 0, max-1); 

    // Print the vector with tab separators: 
    std::copy(numbers.begin(), numbers.end(), 
      std::ostream_iterator<int>(std::cout, "\t")); 
    std::cout << std::endl; 

    return 0; 
} 


void quickSort(vector<int> &numbers, int start, int end) 
{ 
    int i = start; 
    int j = end; 
    int pivot=numbers[start]; 
    int temp; 
    while(i != j) 
    { 
     while(numbers[i] < pivot && i < j) 
      i++; 
     while(numbers[j] >= pivot && i < j) 
      j--; 

     temp = numbers[i]; 
     numbers[i] = numbers[j]; 
     numbers[j] = temp; 

     if(j < start) 
     { 
      quickSort(numbers, start, j); 
     } 

     if(i < start) 
     { 
      quickSort(numbers, i, end); 
     } 
    } 
    return; 
} 
+2

Когда вы проходите программу в отладчике, в какой момент фактическое состояние программы отклоняется от того, что вы ожидаете от состояния? –

+0

, когда он доходит до 'temp = numbers [i];' он устанавливает его в '7', и я не совсем понимаю, почему. – Jmh2013

ответ

2

Возможно, помимо прочего, вы не просматриваете содержимое вектора, когда вы перемещаете индексы, чтобы найти своп. В этом разделе:

while(i < pivot && i < j) 
     i++; 
    while(j >= pivot && i < j) 
     j--; 

должен быть изменен на это:

while(numbers[i] < pivot && i < j) 
     i++; 
    while(numbers[j] >= pivot && i < j) 
     j--; 

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

Аналогичным образом, вы должны выбрать pivot как значение массива. Например. pivot = numbers[start]

+0

Он по-прежнему сортирует пару чисел сейчас. Но теперь я не могу понять, почему он не сортирует их всех. Я обновил свой вопрос с помощью ввода и вывода, а также обновленного кода. – Jmh2013

+0

Хороший улов! :) Я не могу поверить, что я смотрел прямо мимо этого. – sarnold

+0

Даже с исправлениями, я думаю, у вас все еще есть несколько проблем. Я не могу рекомендовать достаточно обучения для использования gdb или другого отладчика. В частности, я думаю, что два рекурсивных обращения к quicksort должны быть за пределами цикла while - сначала вы хотите сделать все свопы, а затем перечислить две половинки списка. Во-вторых, я не понимаю, почему у вас есть 'if (j happydave

3

Эта линия выглядит неуместно:

int pivot=numbers.size()/2; 

Вы выбираете для вашего поворота среднего элемента numbers вектор независимо от start и end позиций.

+0

Да, должно быть «int pivot = numbers [(start + end)/2]; – MrWuf

+0

Для моей цели, я считаю, что средний элемент является стержнем, который имеет наибольший смысл. Если бы я заменил то, что у меня есть с 'pivot = numbers [(start + end)/2];' он все равно установил бы среднюю часть с моим кодом. – Jmh2013

+0

@ Fourthmeal70 Нет регулярного стержня конца 1 для регулярной быстрой сортировки. –