Blog

It's a Wonderful Life

冒泡算法内外层循环次数的控制问题

2016-05-04 18:15 Posted in Learn with C

冒泡算法是一种常用的排序算法,其主要思路是构建一个嵌套循环结构。外层循环负责依次将数组中的每个元素挑选出来参与内层循环,内层循环负责比较每相邻两个元素的大小,并视情况将二者的位置互换。

值得注意的是,在代码实现的过程中,必须要注意内外层循环的次数(均为N - 1次),如果次数控制不当,会引起数组元素溢出的问题。

例如:

#include <stdio.h>
#define NUM 10

int main(void) {

 printf("Please input %d numbers.\n", NUM);
 int num[NUM], i, j, temp;

  //从用户输入接受十个数字
 for (i = 0; i < NUM; i++) {
  scanf_s("%d", &num[i]);
 }

  //用冒泡法进行排序,控制外层循环
 for (i = 0; i < NUM; i++) {
  //控制内层循环
  for (j = 0; j < NUM; j++) {
   if (num[j] > num[j + 1]) {
    temp = num[j];
    num[j] = num[j + 1];
    num[j + 1] = temp;
   }
  }
 }

  //输出排序后的数组
 for (i = 0; i < NUM; i++) {
  printf("%d ", num[i]);
 }
 printf("\n");

}

输入 9 8 7 6 5 4 3 2 1 0 并键入回车,程序会抛出运行时错误。 循环部分应写为:

  //用冒泡法进行排序,控制外层循环
 for (i = 0; i < NUM - 1; i++) {
  //控制内层循环
  for (j = 0; j < NUM - 1; j++) {
   if (num[j] > num[j + 1]) {
    temp = num[j];
    num[j] = num[j + 1];
    num[j + 1] = temp;
   }
  }
 }