酷站(www.ku0.com)-致力于为互联网从业者提供专业的网络资源资讯

热门关键词:  企业  as  baidu  c4rp3nt3r  美女

C++冒泡排序及其优化算法的介绍

来源:互联网 作者:秩名 人气: 发布时间:2021-11-28
本篇文章主要介绍了C++冒泡排序及其优化算法的介绍,对大家的学习或者工作具有一定的参考学习价值,感兴趣的小伙伴们可以参考一下,也感谢大家对酷站(ku0.com)的支持。

冒泡排序极其优化

算法步骤

1.比较相邻的元素。如果第一个比第二个大,就交换他们两个。

2.对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。

3.针对所有的元素重复以上的步骤,除了最后一个。

4.持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较

全部程序

//为了随机生成区间 [m,n] 之间的整数,可以用公式 rand()%(n-m+1)+m。
#include<iostream>
using namespace std;
#define N 20
int main(){
    int arry[N]={0};
    for(int i=0;i<N;i++)
        arry[i]=rand()%(100-1+1)+1;
    for (int i = 1; i <= N; i++) {
        printf("%d \t", arry[i-1]);
        if (i % 5 == 0)
            printf("\n");
    }
    /*****************冒泡排序*********************/
    int s = 0;//    当第一次完全有序时直接跳过s可以是小于0的数字
    for(int e=N-1;e>0;e--){        
        for(int b=0;b<e;b++){
            if(arry[b]<arry[b+1]){
                int tep=arry[b];
                arry[b]=arry[b+1];
                arry[b+1]=tep;
                s=b+1;//记录最后一次交换的位置(取循环下标最大值)
            }
        }
        e=s;
    }
    printf("\n排序后:\n");    
    for (int i = 1; i <= N; i++) {
        printf("%d \t", arry[i-1]);
        if (i % 5 == 0)
            printf("\n");
    }
    getchar();
    return 0;
}

 

冒泡排序代码

for(int e=N-1;e>0;e--){                //外循环:N个数据比较N-1次
        for(int b=0;b<e;b++){        //内循环:每大循环1次就少一次比较
            if(arry[b]<arry[b+1]){
                int tep=arry[b];
                arry[b]=arry[b+1];
                arry[b+1]=tep;
            }
        }
    }

优化思路

有可能一堆数据后面已经排好序,或者循环几次后,后面的数据就是有序的。这个时候如果我们标记最后一次数据交换的位置。外循环就会减少循环的次数。注意观察下面排序的过程(绿色是在比较(交换)黄色是比较完成)

冒泡排序优化核心代码

/*****************冒泡排序优化*********************/
    int s = 0;//    定义变量用来标记角标
    for(int e=N-1;e>0;e--){        
        for(int b=0;b<e;b++){
            if(arry[b]<arry[b+1]){
                int tep=arry[b];
                arry[b]=arry[b+1];
                arry[b+1]=tep;
                s=b+1;//记录最后一次交换的位置(取循环下标最大值)
                      //arry[b],arry[b+1]这两个数据交换取角标较大的b+1
            }
        }
        e=s;
    }

版权声明:本文内容来源于互联网或用户自行发布贡献,该文观点仅代表原作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 959677720#qq.cn(#换@) 举报,一经查实,本站将立刻删除。
原文链接:https://blog.csdn.net/weixin_52062043/article/details/119915328

相关文章

  • c++11中std::move函数的使用

    c++11中std::move函数的使用

    C++11在运行期有所增强,通过增加核心的右值引用机制来改善临时对象导致的效率低下的问题。C++临时对象引入了多余的构造、析构及其内部资源的申请释放函数调用,导......
    01-26
  • 让我们一起来对C语言指针再分析

    让我们一起来对C语言指针再分析

    初次认识指针,我们大概了解到一下知识。 1. 指针就是个变量,用来存放地址,地址唯一标识一块内存空间。 2. 指针的大小是固定的 4/8 个字节( 32 位平台 /64 位平台)......
    01-26
  • C语言的线性表之顺序表你了解吗?

    C语言的线性表之顺序表你了解吗?

    线性表 顺序表 (C语言) 概念 线性表的顺序表示指的是用一组地址连续的存储单元依次存储线性表中的数据元素,这种表示也称做线性表的顺序储存结构或顺序映像。通常......
    01-25
  • C语言实现一个闪烁的圣诞树的方法

    C语言实现一个闪烁的圣诞树的方法

    圣诞节来啦!看到很多小伙伴用各种语言画出了圣诞树,于是就想用 C 语言来画一颗圣诞树,有点粗糙,下面先来看一下效果图吧! 图1 圣诞树 下面来看下源码,如下所......
    12-27
  • Unity3D实现甜品消消乐游戏的教程

    Unity3D实现甜品消消乐游戏的教程

    前言 解释: 之前用的ScreenToGif录屏,因为上传的.gif最大不超过5MB,所以做了不少删帧和色彩弱化等处理,这才导致色彩看上去不是很舒服,不要盯着它看太久,不然会有......
    12-24
  • C语言的常量和字符串的详解介绍

    C语言的常量和字符串的详解介绍

    常量种类 C语言中,我们常使用的常量有以下几种: 字面常量 const常变量 #define定义的标识符常量 枚举常量 代码如下: #includestdio.h enum { //使用enum来建立枚举常量 papa,/......
    12-13
  • C语言把浮点数转换为字符串的方法

    C语言把浮点数转换为字符串的方法

    把浮点数转换为字符串 1、把float/double格式化输出到字符串 标准的C语言提供了atof函数把字符串转double,但是没有提供把float/double转换为字符串的库函数,而是采用sprint......
    12-10
  • C语言系统调用约定介绍

    C语言系统调用约定介绍

    常见的函数调用约定 cdecl , stdcall , fastcall , thiscall , naked call 简单介绍 HANDLE WINAPI GetStdHandle( _In_ DWORD nStdHandle ); //WINAPI不是返回值的类型,HANDLE才是 像这种函数的返回值我......
    12-07
  • C语言打印某一年中某月的日历的方法

    C语言打印某一年中某月的日历的方法

    大致思路: ① 判断输入的年份是否闰年; ② 计算输入月份的第一天是该年的第几天; ③ 计算输入月份的第一天是星期几; ④ 输出。 结合代码使用: #define _CRT_SECURE......
    12-06
  • C语言实现可排序通讯录的代码

    C语言实现可排序通讯录的代码

    1.目的 写一个实用型通讯录,它有如下功能: 显示目录 void ShowMenu() { printf(#######################\n); printf(#1.Add 2.Del 3.Search #\n); printf(#4.Mod 5.Show 6.Clear #\n); printf(#7.Sort 0.Exit #\......
    11-29