c++中的冒泡排序法的升序降序
c++中的冒泡排序法在升序的时候必须满足第一个数大于第二个数降序排列的时候必须满足第一个数小与第二个数,不然就会出现错误!!请帮忙解答如for(j=0;j<9;j++)f...
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(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
能具体解释一下冒泡法吗? 展开
7个回答
展开全部
楼主,你应该说你的程序实现的时候“升序的时候必须满足第一个数大于第二个数降序排列的时候必须满足第一个数小与第二个数,不然就会出现错误”,不要说人家冒泡排序会有这样的漏洞。冒泡排序的思想:比较相邻的两个,按照排序要求进行换位(升序、降序相反)。正确的算法应该是这样的:
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(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;
}
这是另外一个人回答的!!
追答
你说的“后面”是指我的代码不对,还是说你贴的这个人的代码不对?如果你真正了解冒泡之所在,你就会得到我那样的循环的。
你贴的那个人的回答,我先不说他结果对不对,我只说他不是冒泡排序
展开全部
你应该是边界处理错了 看你的第二重循环,当j = 0时,第二重循环变成了
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
冒泡法的具体解释,你自己手动执行一遍 就可以理解的很深了 只是看效果不一定很明显
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
冒泡法的具体解释,你自己手动执行一遍 就可以理解的很深了 只是看效果不一定很明显
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
void bubble_sort(int *x, int n)
{
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后面的都是排序排好了的。*/
}
}
}
}
仅供参考。
{
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循环改一下就行了。
for(i=0;i<9-j-1;i++)
冒泡排序,比如升序排序的话,就是第一次把整个数组中最大的数放到最后一个位置,第二次将第二大的数放到倒数第2个位置。。。。
for(i=0;i<9-j-1;i++)
冒泡排序,比如升序排序的话,就是第一次把整个数组中最大的数放到最后一个位置,第二次将第二大的数放到倒数第2个位置。。。。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
for(j=0;j<8;j++)
for(i=j+1;i<9;i++)///我记得这里好像是这样的吧。不知道错了没有。
if(a[i]>a[j])
{
t=a[i];a[i]=a[j];a[j]=t;
}
for(i=j+1;i<9;i++)///我记得这里好像是这样的吧。不知道错了没有。
if(a[i]>a[j])
{
t=a[i];a[i]=a[j];a[j]=t;
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询