人心所向 发表于 2023-1-20 19:37

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并已赋值,但不知道为什么排序顺序不对。

zhaoqingdz 发表于 2023-1-20 20:07

不多说了!来冒个泡!看楼下们的分析

Pammer 发表于 2023-1-20 20:20

本帖最后由 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那么多的元素

人心所向 发表于 2023-1-20 21:31

Pammer 发表于 2023-1-20 20:20
代码1内层循环完之后应该把t赋0
#include
using namespace std;

懂了懂了,之前是因为内循环时,第二遍循环下标没改,导致判断时的元素不是对应的元素,说白了就是元素不是从0位置开始判断的,所以顺序会出错。

xintiandi 发表于 2023-1-20 22:00

还是devcpp,难道是小学信奥赛?

我是sb 发表于 2023-1-21 00:59

冒泡排序最简单的一种排序

andrew9980 发表于 2023-1-21 09:38

其他几种经典排序算法也可以学一下
页: [1]
查看完整版本: C++冒泡算法问题