冒泡排序极其优化(c/c++版本)

简介: 冒泡排序极其优化算法步骤1.比较相邻的元素。如果第一个比第二个大,就交换他们两个。2.对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。3.针对所有的元素重复以上的步骤,除了最后一个。4.持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较

冒泡排序极其优化


算法步骤


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


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


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


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


4388bc38ca73fc17b2410a732585040.png


此图片来源网络


网络异常,图片无法展示
|
网络异常,图片无法展示
|

全部程序


//为了随机生成区间 [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;
}


38754f8bf573433a8dae1a015662ed57.png


冒泡排序代码


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;
      }
    }
  }


优化思路


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


37e043cddd80a4367f4047229b6c6ee.png


此图片来源网络


冒泡排序优化核心代码


/*****************冒泡排序优化*********************/
  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;
  }


目录
相关文章
|
1月前
|
安全 编译器 程序员
【C++篇】C++类与对象深度解析(六):全面剖析拷贝省略、RVO、NRVO优化策略
【C++篇】C++类与对象深度解析(六):全面剖析拷贝省略、RVO、NRVO优化策略
47 2
|
1月前
|
Linux 编译器 测试技术
【C++】CentOS环境搭建-快速升级G++版本
通过上述任一方法,您都可以在CentOS环境中高效地升级G++至所需的最新版本,进而利用C++的新特性,提升开发效率和代码质量。
167 64
|
1月前
|
Linux 编译器 测试技术
【C++】CentOS环境搭建-快速升级G++版本
通过上述任一方法,您都可以在CentOS环境中高效地升级G++至所需的最新版本,进而利用C++的新特性,提升开发效率和代码质量。
202 63
|
1月前
|
安全 测试技术 C++
【C++篇】从零实现 C++ Vector:深度剖析 STL 的核心机制与优化2
【C++篇】从零实现 C++ Vector:深度剖析 STL 的核心机制与优化
64 6
|
1月前
|
安全 测试技术 C++
【C++篇】从零实现 C++ Vector:深度剖析 STL 的核心机制与优化1
【C++篇】从零实现 C++ Vector:深度剖析 STL 的核心机制与优化
60 7
|
3月前
|
缓存 C++ Windows
Inno setup 脚本判断 Microsoft Visual C++ Redistributable 不同版本区别
Inno setup 脚本判断 Microsoft Visual C++ Redistributable 不同版本区别
|
5月前
|
Linux vr&ar C语言
Linux怎样更新Centos下Gcc版本支持C17?Centos7快速安装gcc8.3.1 可支持C++17(附gcc相关链接整理)
Linux怎样更新Centos下Gcc版本支持C17?Centos7快速安装gcc8.3.1 可支持C++17(附gcc相关链接整理)
316 2
|
5月前
|
编译器 C++ 开发者
C++一分钟之-返回值优化与Move Semantics
【6月更文挑战第19天】C++的RVO与移动语义提升效率,减少对象复制。RVO是编译器优化,避免临时对象的创建。移动语义通过右值引用和`std::move`转移资源所有权。注意RVO不是总有效,不应过度依赖。使用移动语义时,避免误用`std::move`导致对象无效。示例展示了RVO和移动构造函数的应用。理解并恰当使用这些机制能写出更高效代码。
67 3
|
5月前
|
C++
C++数组(定义、遍历、长度、地址、最大值、逆置、冒泡排序)
C++数组(定义、遍历、长度、地址、最大值、逆置、冒泡排序)
|
6月前
|
消息中间件 算法 Java
C++实时通信优化技术探究
C++实时通信优化技术探究
74 3