菜鸟学C语言,冒泡排序交换位置不理解,求大神解答

 int main()
{
    int array[10] = { 56, 78, 2, 9, 98, 23, 56, 89, 74, 122 };
    int i, j;
    int temp = 0;
    for (i = 0; i < 10; i++)
    {
        for (j = 1; j <10 - i; j++)
        {
            if (array[j - 1]>array[j])
            {
                temp = array[j];
                array[j] = array[j-1];
                array[j-1] = temp;
            }

            /*if (array[j] > array[j + 1])
            {
                temp = array[j+1];
                array[j+1] = array[j];
                array[j] = temp;
            }*/
        }
    }

两种交换位置的方法感觉一样,为什么有一种执行的是错误的

 for (j = 1
 这里j从1开始,用if (array[j] > array[j + 1])是没有对array[0]进行比较处理

注释掉的那种变量j从0开始?


使用j和j-1可以正确执行

你可以尝试将数组的个数减小到3进行调试,这样理解比较快!!

i=0,j最大就是9,j+1就是10了,明显超出了

一.冒泡排序的基本思路是:每次都将相邻的两个数比较,将小的调到前头。
对于n个数,需要比较n-1趟,在第1趟中要进行n-1次的两两比较,而在第j趟时,需要进行n-j次两两比较。
1.代码分析:
 12 for (i = 0; i < 9; i++)

  13 {
 14 for (j = 1; j  15 {
  16 if (a[j - 1]>a[j])
  17 {
 18 temp = a[j];
  19 a[j] = a[j-1];
 20 a[j-1] = temp;
  21 }
  22 }
  23 }

这里最为关键的地方在于if判断语句中的数组的下标:
   if(a[j-1] > a[j])
因为数组的下标是从0开始。j初始值为1,所以该语句的功能是判断数组中的第一个元素与第二个元素的大小。若把该if判断语句换为了if(a[j] > a[j+])之后,
相当于忽略了数组中的第一个元素,直接比较数组中的第二个元素和第三个元素,显然是要出错的。

附加:
![图片说明](https://img-ask.csdn.net/upload/201608/09/1470758003_918539.png)

![图片说明](https://img-ask.csdn.net/upload/201608/09/1470758057_662420.png)