Функция быстрой сортировки продолжает возвращать "завершено, ошибка сегментации" - PullRequest
0 голосов
/ 30 мая 2020

Я пытаюсь заставить эту функцию быстрой сортировки работать, но возникает ошибка «завершено, ошибка сегментации». Могу я получить помощь? Функция перестала работать, когда я объединил циклы while с помощью оператора &&.

#include <stdio.h>

void swap(int a[], int b, int c){
  int temp=a[b];
  a[b]=a[c];
  a[c]=temp;

}

void quicksort_fixed(int *number,int first,int last){
      int pivot=last;
      int smaller_index=first;
      int loop_variable=last;

   if(first<last){

      while((number[smaller_index] <= number[pivot])&&(smaller_index < loop_variable)){
        //printf("smaller index (%d) is less than pivot",smaller_index);
        smaller_index++;
        }
      while((number[loop_variable] > number[pivot])&&(smaller_index < loop_variable)){
        //printf("loop variable (%d) is greater than pivot",loop_variable);
        loop_variable--;
        }
        if(smaller_index < loop_variable){
          swap(number,smaller_index,loop_variable);
        }
    }

      swap(number,last,loop_variable);
      quicksort_fixed(number,first,loop_variable-1);
      quicksort_fixed(number,loop_variable+1,last);

}

void test_quicksort_fixed(){
  printf("\nUnsorted List 1: "); // First Test with small consecutive numbers
  int  a[6] = {5,2,3,1,4,6};
  for (int i=0; i < 6; i++){
    printf("%d, ", a[i]);
  }
  printf("\nSorted List 1: ");
  quicksort_fixed(a,0,5);
  for (int i=0; i < 6; i++){
    printf("%d, ", a[i]);
  }

1 Ответ

0 голосов
/ 30 мая 2020

Вам не хватает базового варианта функции быстрой сортировки. Когда рекурсивные вызовы находятся за пределами оператора if, они будут продолжать порождать больше рекурсивных вызовов. В конце концов, для этого потребуется слишком много кадров стека (вы столкнетесь с StackOverflow!), И программа попытается получить доступ к памяти, которой у нее нет (отсюда ошибка сегментации).

Вот правильная реализация:

void quicksort_fixed(int *number, int first, int last) {
  int pivot = first;

  if (first < last) {

    for (int j = first; j < last; j++) {
      if (number[j] < number[last]) {
        swap(number, pivot, j);
        pivot++;
      }
    }
    swap(number, last, pivot);

    quicksort_fixed(number, first, pivot - 1);
    quicksort_fixed(number, pivot + 1, last);
  }
}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...