4

谁能解释为什么这个冒泡排序功能不起作用以及为什么我的输出中丢失了数字?我对C很陌生,所以如果这是我错过的非常明显的事情,请原谅我。

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

int bubble(int array[],int length) {
  int i, j;
  int temp;

  for(i = 0; i < (length); ++i) {
    for(j = 0; j < (length - 1); ++j) {
      if(array[i] > array[i+1]) {
        temp = array[i+1];
        array[i+1] = array[i];
        array[i] = temp;
      }
    }
  }
  return 0;
}

int main() {
  int array[] = {12,234,3452,5643,0};
  int i;
  int length;

  length = (sizeof(array)/sizeof(int));
  printf("Size of array = %d\n", length);
  bubble(array, length);
  for (i = 0; i < (length); ++i) {
    printf("%d\n", array[i]);
  }
  return 0;
}

输出

Size of array = 5
12
234
3452
0
0
4

4 回答 4

4

在您的内部循环中,您根本不使用 j 。仔细检查你的逻辑。另请注意,array[i+1] 超出了数组边界。

于 2010-05-09T22:12:24.253 回答
3
for (i = 0; i < (length-1); ++i) {
  for (j = 0; j < (length-i-1); ++j) {
    if(array[j] > array[j+1]) {
      temp = array[j+1];
      array[j+1] = array[j];
      array[j] = temp;
    }
  }
}

在冒泡排序中,您只使用内部循环变量。

于 2010-05-09T22:39:28.380 回答
0

另一件事,如果我没记错的话,内部循环是从0到;i但我认为这只是一种优化(因为尾部在每一步中都保持排序)。

尝试用纸和铅笔一步一步地运行你的代码。这总是有效的。

于 2010-05-10T10:15:58.803 回答
0
for (i = 0; i < (length); i++) {
  for (j = 1; j < (length-i); j++) {
    if(array[j-1] > array[j]) {
      temp = array[j-1];
      array[j-1] = array[j];
      array[j] = temp;
    }
  }
}
于 2013-08-24T22:35:51.473 回答