//================================================================//
//对数组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]);