Bubble Sorting In C: ошибка значения мусора - PullRequest
0 голосов
/ 28 января 2020

Так недавно я изучал структуры данных в C. Теперь давайте перейдем к моей проблеме

Вот мой код сортировки пузырьков Al go:

#include <conio.h>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>

void swap(int *p, int *q) {
  int temp = *p;
  *p = *q;
  *q = temp;
}

int main() {
  int arr[] = {2, 4, 1, 3, 5, 2, 3, 6, 4};  // see below for arr
  int len = sizeof(arr) / sizeof(int);
  for (int i = len - 1; i >= 0; i--) {
    for (int j = 0; j <= i; j++) {
      if (arr[j] < arr[j + 1]) {
        swap(&arr[j], &arr[j + 1]);
      }
    }
  }
  for (int m = 0; m < len; m++) {
    printf("%d\t", arr[m]);
  }
  return 0;
}

, когда мой массив имеет вид: int arr[]={2,4,1,3,5,2,6,10}; это сортировка отлично, но когда я увеличиваю число значений в arr на единицу, он начинает выдавать мусорное значение.

ex: int arr[]={2,4,1,3,5,2,6,10,13}; output: int arr[]={2,4,1,3,5,2,6,10};

Подробный Anwer Высоко оценен

Ответы [ 2 ]

1 голос
/ 28 января 2020

Когда j=i и i=len-1 (что разрешено в l oop сверх j), проверка:

        if(arr[j]<arr[j+1]){
            swap(&arr[j],&arr[j+1]);
        }

выходит за пределы arr. Кроме того, даже для меньших значений i последняя проверка не требуется. Для исправления вашего кода сделайте условие l oop j < i вместо j <= i.

0 голосов
/ 28 января 2020

Сделайте из вас такие циклы, и у вас никогда не возникнет ошибка "off by one":

for (int i = 0; i < len; i++) {
    for (int j = i+1; j < len; j++) {
        if (arr[j] < arr[i]) {
            swap(&arr[i], &arr[j]);
        }
    }
}
...