C++冒泡算法问题
本帖最后由 南荒北芜 于 2023-2-4 16:34 编辑最近在研究冒泡算法,自己根据网上的资料大概写了一下,程序运行没问题,但是逻辑不对。
代码一:
#include<iostream>
using namespace std;
int main(){
int i[]={0,5,20,10,74,89,63,52,63,96}; //定义数组
int c; //获取数组长度
int a=0; //比较的轮数
int t=0; //每轮比较的次数
int d=0; //交换数值所用
c=sizeof(i)/sizeof(i); //获取数组长度
for(;a<c-1;++a){ //循环次数为数组长度-1即可
for(;t<c-1-a;++t){
if(i<i){
d=i; //临时存放交换的数值
i=i; //交换数值
i=d; //交换临时存放的数值
}
}
}
for(a=0;a<c;++a){
cout<<i<<' ';
}
}
代码二:
#include<iostream>
using namespace std;
int main(){
int i[]={0,5,20,10,74,89,63,52,63,96}; //定义数组
int c; //获取数组长度
int a=0; //比较的轮数
int t=0; //每轮比较的次数
int d=0; //交换数值所用
c=sizeof(i)/sizeof(i); //获取数组长度
for(;a<c-1;++a){ //循环次数为数组长度-1即可
for(t=0;t<c-1-a;++t){
if(i<i){
d=i; //临时存放交换的数值
i=i; //交换数值
i=d; //交换临时存放的数值
}
}
}
for(a=0;a<c;++a){
cout<<i<<' ';
}
}
代码一输出的数值并没有按从大到小顺序排序,但是代码二却能按照从大到小顺序排列,代码仔细检查过了没啥大问题。
但是突然发现循环里加个初始化变量并赋值就可以正确排序了,详见代码二,问题是,代码一中,已经定义了变量t并已赋值,但不知道为什么排序顺序不对。 不多说了!来冒个泡!看楼下们的分析 本帖最后由 Pammer 于 2023-1-20 20:28 编辑
代码1内层循环完之后应该把t赋0
#include<iostream>
using namespace std;
int main(){
int i[]={0,5,20,10,74,89,63,52,63,96}; //定义数组
int c; //获取数组长度
int a=0; //比较的轮数
int t=0; //每轮比较的次数
int d=0; //交换数值所用
c=sizeof(i)/sizeof(i); //获取数组长度
for(;a<c-1;++a){ //循环次数为数组长度-1即可
for(;t<c-1-a;++t){
if(i<i){
d=i; //临时存放交换的数值
i=i; //交换数值
i=d; //交换临时存放的数值
}
}
t=0;
}
for(a=0;a<c;++a){
cout<<i<<' ';
}
}
赋值0之后才能在第二次遍历之后从下标0的元素开始,就和代码二一样了
另外,下标应该用std::size_t而不是int(定义于cstddef),这个是很多人会犯的错误,因为int并不能保证能访问到像size_t那么多的元素
Pammer 发表于 2023-1-20 20:20
代码1内层循环完之后应该把t赋0
#include
using namespace std;
懂了懂了,之前是因为内循环时,第二遍循环下标没改,导致判断时的元素不是对应的元素,说白了就是元素不是从0位置开始判断的,所以顺序会出错。 还是devcpp,难道是小学信奥赛? 冒泡排序最简单的一种排序 其他几种经典排序算法也可以学一下
页:
[1]