吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 689|回复: 6
收起左侧

[已解决] C++冒泡算法问题

[复制链接]
人心所向 发表于 2023-1-20 19:37
本帖最后由 南荒北芜 于 2023-2-4 16:34 编辑

问题1.jpg 问题2.jpg


最近在研究冒泡算法,自己根据网上的资料大概写了一下,程序运行没问题,但是逻辑不对。
代码一:
[C++] 纯文本查看 复制代码
#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[0]);        //获取数组长度 
        for(;a<c-1;++a){        //循环次数为数组长度-1即可 
                for(;t<c-1-a;++t){
                        if(i[t]<i[t+1]){
                                d=i[t];        //临时存放交换的数值 
                                i[t]=i[t+1];        //交换数值
                                i[t+1]=d;        //交换临时存放的数值 
                        }
                }
        }
        for(a=0;a<c;++a){
                cout<<i[a]<<' ';
        }
}

代码二:
[C++] 纯文本查看 复制代码
#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[0]);        //获取数组长度 
        for(;a<c-1;++a){        //循环次数为数组长度-1即可 
                for(t=0;t<c-1-a;++t){
                        if(i[t]<i[t+1]){
                                d=i[t];        //临时存放交换的数值 
                                i[t]=i[t+1];        //交换数值
                                i[t+1]=d;        //交换临时存放的数值 
                        }
                }
        }
        for(a=0;a<c;++a){
                cout<<i[a]<<' ';
        }
}

代码一输出的数值并没有按从大到小顺序排序,但是代码二却能按照从大到小顺序排列,代码仔细检查过了没啥大问题。
但是突然发现循环里加个初始化变量并赋值就可以正确排序了,详见代码二,问题是,代码一中,已经定义了变量t并已赋值,但不知道为什么排序顺序不对。

免费评分

参与人数 1吾爱币 +1 收起 理由
zhaoqingdz + 1 用心讨论,共获提升!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

zhaoqingdz 发表于 2023-1-20 20:07
不多说了!来冒个泡!看楼下们的分析
Pammer 发表于 2023-1-20 20:20
本帖最后由 Pammer 于 2023-1-20 20:28 编辑

代码1内层循环完之后应该把t赋0
[C++] 纯文本查看 复制代码
#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[0]);        //获取数组长度
        for(;a<c-1;++a){        //循环次数为数组长度-1即可
                for(;t<c-1-a;++t){
                        if(i[t]<i[t+1]){
                                d=i[t];        //临时存放交换的数值
                                i[t]=i[t+1];        //交换数值
                                i[t+1]=d;        //交换临时存放的数值
                        }
                }
            t=0;
        }
        for(a=0;a<c;++a){
                cout<<i[a]<<' ';
        }
}

赋值0之后才能在第二次遍历之后从下标0的元素开始,就和代码二一样了
另外,下标应该用std::size_t而不是int(定义于cstddef),这个是很多人会犯的错误,因为int并不能保证能访问到像size_t那么多的元素

免费评分

参与人数 2吾爱币 +4 热心值 +1 收起 理由
zxczxc19941102 + 1 我很赞同!
人心所向 + 3 + 1 谢谢@Thanks!

查看全部评分

 楼主| 人心所向 发表于 2023-1-20 21:31
Pammer 发表于 2023-1-20 20:20
代码1内层循环完之后应该把t赋0
[mw_shl_code=cpp,true]#include
using namespace std;

懂了懂了,之前是因为内循环时,第二遍循环下标没改,导致判断时的元素不是对应的元素,说白了就是元素不是从0位置开始判断的,所以顺序会出错。
xintiandi 发表于 2023-1-20 22:00
还是devcpp,难道是小学信奥赛?
我是sb 发表于 2023-1-21 00:59
冒泡排序最简单的一种排序
andrew9980 发表于 2023-1-21 09:38
其他几种经典排序算法也可以学一下
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 03:01

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表