奇怪的冒泡排序行为

Posted

技术标签:

【中文标题】奇怪的冒泡排序行为【英文标题】: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 的一部分,您需要学习如何使用调试器。调试器将允许您一次单步执行排序函数,并在每一步后检查数组。 您可能想阅读我的回答 ***.com/questions/101070/…,了解为什么 ij 可能是嵌套循环中变量的无用名称。 【参考方案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;
    
  

【讨论】:

以上是关于奇怪的冒泡排序行为的主要内容,如果未能解决你的问题,请参考以下文章

看到这个冒泡排序优化,还敢说不懂吗

为啥冒泡排序被称为冒泡排序?

冒泡排序算法有几种写法?

java编程的冒泡等排序示例

nodejs实现冒泡排序和快速排序

冒泡排序