C ++, почему в моей сортировке выбора указателя есть ошибка сегментации? - PullRequest
0 голосов
/ 03 октября 2018

Ниже мой код на C ++.Я пытаюсь реализовать сортировку выбора с помощью указателей (начало и конец).Код компилируется, но я получаю ошибку сегментации, прежде чем он отсортирует случайный сгенерированный список (в настоящее время печатает только случайные числа).

Любая помощь относительно того, почему это так и как это исправить, будет принята с благодарностью.,

#include<stdio.h>
#include<stdlib.h>
#include <iostream>

using namespace std;

void selectionSort(int *start, int *stop) {
   for (int i = *start; i < *stop - 1; ++i) {
     int min = i;
       for (int j = i + 1; j < *stop; ++j) {
         if ((&start[0])[j] < (&start[0])[min])
            min = j;
         }
     swap((&start[0])[i], (&start[0])[min]);
   }
}


int main()
{
  int size = 10;
    int* data = new int[size];
    for (int i = 0; i < size; ++i)
   {
      data[i] = rand() % size;
    }
    for (int k = 0; k < size; k++)
    {
      cout << data[k] << " ";
    }
    cout << endl;
    selectionSort(data, data+size);
    for (int j = 0; j < size; j++)
    {
      cout << data[j+1] << " ";
    }
    return 0;
}

1 Ответ

0 голосов
/ 03 октября 2018

Общая логика в вашей функции в правильном направлении.Однако вы, кажется, запутались между значениями элементов массива и индексированием, используемым для доступа к элементам массива.

Строка

for (int i = *start; i < *stop - 1; ++i)

показывает первые знакипутаница.

  1. Вы инициализируете i значением первого элемента массива и увеличиваете значение на последующих итерациях цикла.Это не правильно.Увеличение значения первого элемента массива не имеет логического смысла.

  2. *stop приводит к неопределенному поведению, поскольку stop указывает на место после последнего действительного элемента.

Вам необходимо использовать int* i, int* j и int* min для правильной сортировки элементов.Это также означает обновление почти всей функции соответственно.Вот обновленная функция, которая работает для меня.

void selectionSort(int *start, int *stop) {
   for (int* i = start; i < (stop - 1); ++i) {
      int* min = i;
      for (int* j = i + 1; j < stop; ++j) {
         if (*j < *min)
         {
            min = j;
         }
      }
      swap(*i, *min);
   }
}

Кроме того, следующие строки в main не верны.В итоге вы получите доступ к массиву с помощью индекса «вне границ».

for (int j = 0; j < size; j++)
{
   cout << data[j+1] << " ";
}

Замените их на

for (int k = 0; k < size; k++)
{
   cout << data[k] << " ";
}
...