【问题标题】:Strange Bubble sort behaviour奇怪的冒泡排序行为
【发布时间】:2011-02-17 11:12:29
【问题描述】:

谁能解释为什么这个冒泡排序功能不起作用以及为什么我的输出中丢失了数字?我对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

【问题讨论】:

  • 这是我今天在这里看到的最好的问题 - 赞成。但是告诉你问题出在哪里会破坏编程的乐趣。想想当你自己整理(不是双关语)时你会感觉多么聪明。
  • 作为学习 C 的一部分,您需要学习如何使用调试器。调试器将允许您一次单步执行排序函数,并在每一步后检查数组。
  • 您可能想阅读我的回答 stackoverflow.com/questions/101070/…,了解为什么 ij 可能是嵌套循环中变量的无用名称。

标签: c bubble-sort


【解决方案1】:

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

【讨论】:

    【解决方案2】:
    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;
        }
      }
    }
    

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:
        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;
            }
          }
        }
        

        【讨论】:

          猜你喜欢
          • 2016-06-09
          • 1970-01-01
          • 1970-01-01
          • 2015-09-12
          • 2013-05-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-10-09
          相关资源
          最近更新 更多