c++中的冒泡排序法在升序的时候必须满足第一个数大于第二个数降序排列的时候必须满足第一个数小与第二个数,不然就会出现错误!!请帮忙解答
如for(j=0;j<9;j++)
for(i=0;i<9-j;i++)
if(a[i]>a[i+1])
{
t=a[i];a[i]=a[i+1];a[i+1]=t;
}
//这应该是按照升序排列数字从小到大,但如果输入1 2 6 5 4 8 9 3 7 出来的结果就不是123456789
能具体解释一下冒泡法吗?
for(i=0;i<9;i++)
for(j=0;j<9-1;j++)
if(a[j]>a[j+1])//升序
{
t=a[j];
a[j]=a[j+1];
a[j+1]=t;
}追问
后面的程序不对吧!!会出现跟我一样的错误
for(j=0;ja[j])
{
t=a[i];a[i]=a[j];a[j]=t;
}
这是另外一个人回答的!!
你说的“后面”是指我的代码不对,还是说你贴的这个人的代码不对?如果你真正了解冒泡之所在,你就会得到我那样的循环的。
你贴的那个人的回答,我先不说他结果对不对,我只说他不是冒泡排序
两个都不对啊,我想问下你的冒泡法,i,j之间有什么联系?for(i=0;i<9;i++)
for(j=0;j<9-1;j++)这个地方应该是 for(j=0;j<9-i;j++)吧,我就是不懂冒泡法,才想问问大家的呀~~
i跟j的联系?i是要冒泡的次数=数列的长度,j是冒泡循环的起始位置到终止位置,每次冒泡都要从头开始,到末尾或是‘末尾-i’
‘9-i’是优化后的,原始的是从头到尾。冒泡排序的思想比较相邻两个,给你举个列子吧:
6 3 5 8 2 9 4 原始数据
3 5 6 2 8 4 9 第一次冒泡,9是最大值,沉到了最底下(如果是‘9-i’,以后不比较9了,效率更高些)
3 5 2 6 4 8 9 第二次冒泡,8沉下
3 2 5 4 6 8 9 第三次冒泡,6沉下
2 3 4 5 6 8 9 第四次冒泡 5沉下(其它的排好了是因为恰好,但是还会执行下一次冒泡,只是数据不会换位置了)
2 3 4 5 6 8 9 第五次
2 3 4 5 6 8 9 第六次
2 3 4 5 6 8 9 第七次(结束)
冒泡排序的第二重循环的j要从0变到末尾(优化后是9-i)
for(i = 0; i <9; ++i)
这个时候 ,当循环进行到i = 8时,if中的比较就变成了if(a[8] > a[9])
很明显a[9](数组a有9个元素,应该是a[0]到a[8])越界了,因此会导致错误
所以应该把j的初始赋值变为 j = 1
冒泡法的具体解释,你自己手动执行一遍 就可以理解的很深了 只是看效果不一定很明显
{
int j, k, h, t;
for (h=n-1; h>0; h=k) /*循环到没有比较范围*/
{
for (j=0, k=0; j<h; j++) /*每次预置k=0,循环扫描后更新k*/
{
if (*(x+j) > *(x+j+1)) /*大的放在后面,小的放到前面*/
{
t = *(x+j); *(x+j) = *(x+j+1); *(x+j+1) = t; /*完成交换*/
k = j; /*保存最后下沉的位置。这样k后面的都是排序排好了的。*/
}
}
}
}
仅供参考。
for(i=0;i<9-j-1;i++)
冒泡排序,比如升序排序的话,就是第一次把整个数组中最大的数放到最后一个位置,第二次将第二大的数放到倒数第2个位置。。。。
for(i=j+1;i<9;i++)///我记得这里好像是这样的吧。不知道错了没有。
if(a[i]>a[j])
{
t=a[i];a[i]=a[j];a[j]=t;
}