2016年5月4日星期三

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

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

值得注意的是,在代码实现的过程中,必须要注意内外层循环的次数(均为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;
}
}
}

没有评论:

发表评论