Ошибка сегментации внутри цикла while - PullRequest
0 голосов
/ 07 июля 2019

В этом коде, когда я заменяю i + 1 на j + 1 в цикле while, это дает ошибку сегментации. Я не понимаю почему, так как значения обе переменные одинаковы.

Этот фрагмент кода предназначен для поиска минимального числа перестановок, необходимых для сортировки неупорядоченного массива, состоящего из последовательных целых чисел, в порядке возрастания.

int minimumSwaps(int n, int* a) {
int i=0,j=0,temp=0,swap=0;
for(i=0;i<n-1;i++)
{
    if(i+1!=a[i])
    {
        j=i;
        while(a[j]!=i+1)
        {
            j++;
        }
        temp=a[i];
        a[i]=a[j];
        a[j]=temp;
        swap++;
    }
    else 
    {
        continue;
    }

}
return swap;
}

Ответы [ 3 ]

0 голосов
/ 07 июля 2019

когда я заменяю i + 1 на j + 1 в цикле while, это вызывает ошибку сегментации. Я не понимаю, почему, поскольку значения обеих переменных одинаковы .

Нет, значения переменных не одинаковы.

    j=i;   // Here i and j hold the same value
    while(a[j]!=i+1)
    {
        j++;  // but once you execute this line i and j are no longer the same
    }

Таким образом, изменение while(a[j]!=i+1) на while(a[j]!=j+1) полностью изменит поведение кода.

Кстати - правильный путь while(a[j]!=i+1)

0 голосов
/ 07 июля 2019

Прежде всего вы должны проверить входные аргументы, заданные вашей функции:

int minimumSwaps(int n, int* a) {
   if(n<=0){
      ...
   }

   if(NULL==a){
      ...
   }
   ...
}

Это избавит вас от необходимости иметь дело с неправильным вводом. Затем, чтобы избежать нежелательных показаний из-за границы памяти, вы должны отредактировать условие вашего цикла while, как показано ниже:

while(j<n-1 &&  a[j]!=i+1){
   ...
}
0 голосов
/ 07 июля 2019

В двух местах вы можете заменить i+1 на j+1. Если вы имеете в виду второе местоположение,

while(a[j]!=i+1)
{
  j++;
}

условие в цикле while будет постоянно становиться более высоким значением (каждая итерация j+1 становится более высоким оценщиком, а a[j] ссылается на другое значение, поэтому итерация цикла не закончится, пока вы не попытаетесь получить доступ за пределами границ a.

...