对数组a[0:8]=[3,2,6,5,9,4,7,1,8]进行冒泡排序,排序为什么不对

//================================================================//
//对数组a[0:8]=[3,2,6,5,9,4,7,1,8]进行冒泡排序 //
//================================================================//

int main()

{
int a[9] = { 3,2,6,5,9,4,7,1,8 };
int i,j;

for (i = 9;i>0;i--) 
{

    for (j = 0; j<9-i;j++)
    {
        if (a[j] > a[j + 1])
        {
            int temp = a[j];
            a[j] = a[j + 1];
            a[j + 1] = temp;
        }
    }
}
for (j=0;j<9;j++)
cout << a[j];
return 0;

}

你没理解冒泡排序的意义,建议你把书拿过来仔细看一下这个算法的思想是什么,
大概意思是:
第一次排序,把最大的(或者最小的)放到最后一个位子上
第二次排序,最后一个位子不用参与比较了,因为刚才已经确定他是最大的了,所以循环的时候不用考虑最后一位,这次会把最大的放在倒数第二个位子上
.........
第N次只剩下一个数,然后就是一个有序序列。

稍微改了下你的代码,

 int main()

{
    int a[9] = { 3, 2, 6, 5, 9, 4, 7, 1, 8 };
    int i, j;

/*
    for (i = 9; i > 0; i--)
    {

        for (j = 0; j<9 - i; j++)
        {
            if (a[j] > a[j + 1])
            {
                int temp = a[j];
                a[j] = a[j + 1];
                a[j + 1] = temp;
            }
        }
    }*/

    for (i = 0; i < 9; i++)
    {
        for (j = 1; j < 9 - i; j ++)
        {
            if (a[j - 1] > a[j])
            {
                int iTemp = a[j - 1];
                a[j - 1] = a[j];
                a[j] = iTemp;
            }
        }
    }

    for (j = 0; j < 9; j++)
        cout << a[j]<<' '<<endl;

    system("pause");
    return 0;
}

你写的算法大概意思是:
第一轮,【1】和【2】之间选一个最大的放在【2】位子上
第二轮,【1】、【2】、【3】之间选一个最大的放在【3】上
第三轮,...
...
例如你这个:
int a[9] = { 3, 2, 6, 5, 9, 4, 7, 1, 8 };

第一次比较3,2,结果是{2,3,...}
第二次比较3,2,6,结果是{2,3,6...}
第三次比较3,2,6,5,结果是{2,3,5,6,...}
...
最明显的在与1比较的时候,只不过简单的把1往前面进了一位而已,1并没到首位

"for (j = 0; j<9-i;j++)" 改为 "for (j = 0; j<9-1;j++)"

我感觉他们都没有真正理解冒泡排序

    int a[9]={3,2,6,5,9,4,7,1,10};
    int i,j,temp;
    for(i=0;i<9;i++)//每轮确定本轮最值
    for(j=i+1;j<9;j++)//从后面一个数字比较,比较结束a[i]为本轮最值
    {
        if(a[i]>a[j])//交换取较小值
        {
            temp=a[i];
            a[i]=a[j];
            a[j]=temp;
        }
    }
    for(i=0;i<9;i++)
        printf("%d\t",a[i]);