在使用冒泡排序法的时候外循环的条件是i
可以这样理解,一次冒泡排序(假设为升序)会让最大的值上升到数组的末位,这个位置已经是对的了,下一次就不需要再考虑与这个值比较,进行j次后,已经有j的值按正确的升序排列在数组尾部,那么下一趟排序就只用到N-1-j
因为你数组初始只有9个数,如果是9-i的话,下面的比较中的a[j+1]就会越界。比如i=0的时候,如果是j<9-i,那么就是j<9,j的最大值可以是8 ,那么a[j+1]就会是a[9],对于只有9个有效数的数组来说,a[9]是越界的。虽然你的数组定义长度为10,不会越界报错,但a[9]是个随机数,参与排序肯定会出问题。
回答:首先呢,咱先注意几个问题,一是代码格式的问题,换行和括号要加上的,二是主函数可以将几个小功能拆分为几个函数,这样逻辑更清晰一些,最后是冒泡函数的说明了,里面的 j 表示后面还没有排序的数字的下标,因为它采用的是将大的数字(也可以是小的数字)换到最后面去,代码如下(我自己以前写的)
#include <stdio.h>
#define MAX_SIZE 20
typedef int Type;
void printArr(Type arr[], int length)
{
int i;
for (i = 0; i < length; i++)
{
printf("%d ", arr[i]);
}
printf("\n");
}
void bubbleSort(Type arr[], int length)
{
int i, j;
Type temp;
for (i = 0; i < length; i++)
{
for (j = 0; j < length - i - 1; j++)
{
if (arr[j] > arr[j + 1])
{
temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
printArr(arr, length);
}
}
int main()
{
Type arr[] = { 1, 3, 5, 7, 9, 2, 4, 6, 8, 10 };
int length = sizeof(arr) / sizeof(Type);
bubbleSort(arr, length);
}
外循环控制行数,内循环控制列数特征