этот код работает с N = 348, но не работает с N = 349 - PullRequest
0 голосов
/ 12 июля 2020

почему доза этого кода сортировки работает с N = 348, а при N = 349 программа зависает? Ошибки компиляции нет.

#define N 348
int main(void){
  int n[N];
  int temp;

  for(int i=0;i<N;i++) n[i] = rand();

  for(int i=0 ; i<N-1;){
    if (n[i]<n[i+1]) {i++;continue;}
    else {
       temp = n[i];
       n[i] = n[i+1];
       n[i+1] = temp;
       if (i != 0) i--;
       else i++;
    }
  }

  return 0;
}

1 Ответ

4 голосов
/ 12 июля 2020

Поведение программы не зависит от значения N.

В случае, когда два последовательных элемента массива равны друг другу, из-за этого условия будет бесконечное l oop

if (n[i]<n[i+1]) {i++;continue;}
else {

и этот оператор внутри составного оператора else

if (i != 0) i--;

То есть оператор else будет всегда выполняться, когда n[i] равно n[i+1].

Например попробуйте запустить программу для массива

#define N 3
//...
int n[N] = { 1, 2, 2 };

Вы можете избежать ошибки, изменив условие на

if (n[i]<=n[i+1]) {i++;continue;}
else {
...