Код быстрой сортировки не работает должным образом

0
int main()
    {
        int numbers[size] = {14, 7, 23, 31, 1, 20, 6, 3, 40, 5}, start, finish;

        cout << "Numbers are: " << endl;
        for (int i = 0; i < size; i++)
        {
            cout << numbers[i] << "\t";
        }

        finish = 10;
        start = 0;

        quickSort(numbers, start, finish);

        cout << "\n\nSorted: " << endl;
        for (int j = 0; j < size; j++)
        {
            cout << numbers[j] << "\t";
        }

        return 0;
    }

int Partition(int numbers[], int start, int finish)
{

    int pole = start;
    int pivot = numbers[finish];

    for (int k = 0; k < finish - 1; k++)
    {
        if (numbers[k] <= pivot)
        {
            int temp = numbers[k];
            numbers[k] = numbers[pole];
            numbers[pole] = temp;

            pole++;
        }
    }

    int temp2 = numbers[pole];
    numbers[pole] = numbers[pivot];
    numbers[pivot] = temp2;

    return pole;
}

void quickSort(int numbers[], int start, int finish)
{
    int marker;
    if (start < finish)
    {
        marker = Partition(numbers, start, finish);
        quickSort(numbers, start, marker - 1);
        quickSort(numbers, marker + 1, finish);
    }
}

Я чувствую, что у меня что-то не хватает, но я не мог понять, что. Программа не сортируется должным образом. Нужна помощь! Я пытался опрокинуться в середине процесса, чтобы определить, где проблема, из того, что я понимаю, она не сортирует ее полностью. Ну, я не уверен. Я все еще новичок в рекурсии, поэтому, возможно, я сделал что-то неправильно.

  • 1
    int pivot = numbers[finish]; читает за конец массива. Пришло время вам отладить.
  • 0
    ааа, я установил свой финиш = 10, зафиксированный на 9. Но он все равно не сортируется должным образом.
Показать ещё 6 комментариев
Теги:
quicksort

2 ответа

3
Лучший ответ

Вместо

finish = 10;

вы должны написать

finish = size;

В функции разбиения, которую вы написали

int pivot = numbers[finish];

Это читается за пределами массива. Вы имели в виду

int pivot = numbers[finish - 1];

В вашей функции разделов вы запускаете такой цикл:

for (int k = 0; k < finish - 1; k++)

Это начинается с начала всего массива. Должен быть:

for (int k = start; k < finish - 1; k++)

Заключительный шаг вашей функции разбиения не прав:

int temp2 = numbers[pole];
numbers[pole] = numbers[pivot];
numbers[pivot] = temp2;

Это использует значение поворота, а не сводный индекс. Должен быть:

int temp2 = numbers[pole];
numbers[pole] = numbers[finish - 1];
numbers[finish - 1] = temp2;

Реализация quickSort также неверна:

marker = Partition(numbers, start, finish);
quickSort(numbers, start, marker - 1);
quickSort(numbers, marker + 1, finish);

должно быть:

marker = Partition(numbers, start, finish);
quickSort(numbers, start, marker);
quickSort(numbers, marker + 1, finish);

Вышеупомянутые изменения исправляют ваш код.

Более фундаментально, я думаю, вам нужно быть более ясным о том, что означает start и finish. Они следуют за соглашением, которое start с индекса первого элемента, и finish на один больше, чем индекс последнего элемента. Многие из вышеперечисленных ошибок сводились к ошибкам "один за другим" из-за того, что они не полностью понимали это соглашение.

  • 1
    +1 :-) Почему бы вам просто не написать новую быструю сортировку в качестве ответа.
0
int main(){
int numbers[] = {14, 7, 23, 31, 1, 20, 6, 3, 40, 5};
const int size = sizeof(numbers)/sizeof(int);

cout << "Numbers are: " << endl;
for (int i = 0; i < size; i++){
    cout << numbers[i] << "\t";
}

quickSort(numbers, 0, size - 1);//This is the first place you should take care of!
                                //What do you want the third parameter represent?
                                //1.the greatest index of the array;or 2. the length of the array
                                //Here goes the first choose, so size-1
cout << "Sorted: " << endl;
for (int j = 0; j < size; j++){
    cout << numbers[j] << "\t";
} 
return 0;
}

int Partition(int num[], int start, int finish){
int temp;
int pole = start;
int pivot = num[finish];

for (int k = start; k <= finish - 1; k++){//as I mentioned above, choose 1 , so there must be =
    if (num[k] <= pivot){
        temp = num[k];
        num[k] = num[pole];
        num[pole] = temp;

        pole++;
    }
}

temp = num[pole];
num[pole] = num[finish];//you did something wrong here!!
num[finish] = temp;//And here.Not pivot.

return pole;
}

void quickSort(int num[], int start, int finish){
int marker;
if (start < finish){
    marker = Partition(num, start, finish);
    quickSort(num, start, marker - 1);//And here, num[marker] is in its final place,so ending with marker-1 will be fine. 
                                      //Of course, you also can replace it with marker.
    quickSort(num, marker + 1, finish); 
}
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню