超详细的C++冒泡排序(升降)的两种实现方式
目录 1.从高位向低位的依次升序
2.从低位向高位的依次升序
3对于只要求最高位和最低位的简化方式
4降序的实现方式
5判断排序是否完成的方式
预先定义一个交换函数
int swap(int a,int b)
{int temp=b;b=a;a=temp;}
1.从高位向低位的依次升序
首先来看第一种
int bubble_sort_high(vector <int> vec)
{for (int i = 0;i < vec.size()-1;i++)//这里i<size-1是为了少一轮循环,如果没有-1,i取到size-1,那么下一个j循环都不满足循环条件{for (int j = 0;j < vec.size() - 1 - i;j++){if (vec[j] > vec[j + 1]){swap(vec[j], vec[j + 1]);}}}
}
这里如果输入的是3 2 4 1 5 那么先是3和2比较并交换,变成2 3 4 1 5;再是3和4交换,不变;第一轮j循环过后变成2 3 1 4 5;可以看到5在最高位,且之后的循环中只会到倒数第二位,不会与5进行比较使用这种方法最大值可以第一轮求出来
第二轮循环j最大只能是2;变成2 1 3 4 5
第三轮循环j最大只能是1;变成1 2 3 4 5
第四轮不改变顺序
这种方法是相邻的比较,最大值无论在哪里都会被交换到最高位,第一次就可以求出最大值
可以看到这种方法是从高位依次向下排序的
2.从低位向高位的依次升序
int bubble_sort_low(vector <int> vec)
{for (int i = 0;i < vec.size() - 1;i++){for (int j = i+1;j < vec.size();j++)//这里j<size是为了让j能够等于size-1,因为这里没有上一个排序方法的j+1{if (vec[i] > vec[j]){swap(vec[i], vec[j]);}}}
}
还是用3 2 4 1 5来举例子,首先是3和2比较变成2 3 4 1 5;然后是2和4进行比较不变,再是2和1进行比较变成1 3 4 2 5,再1和5进行比较,不变
所以第一次j循环之后顺序变成了1 3 4 2 5,可以清楚的看到最小的1已经放到了最低位,且之后从第二位开始,不会再和1进行判断
第二次循环从第二位开始 首先3和4比较不改变,再3和2进行比较交换得出1 2 4 3 5,再2和5进行比较不变
第三次循环首先比较4和3,交换,最后得到1 2 3 4 5;
第四次循环不改变顺寻
可以看到这种方法是从低位依次向上排好的
3对于只要求最高位和最低位的简化方式
在1的情况分析下如果我们只需要求最大值(让最大值去到最高位)可以简化成
int calculate_maximum(vector <int> vec)
{for (int j = 0;j < vec.size() - 1;j++){if (vec[j] > vec[j + 1]){swap(vec[j], vec[j + 1]);}}
}
在2的情况分析下如果我们只需要求最小值(让最小值去到最低位)可以简化成
int calculate_minimum(vector <int> vec)
{for (int j = 1;j < vec.size();j++)//这里j<size是为了让j能够等于size-1,因为这里没有上一个排序方法的j+1{if (vec[0] >vec[j]){swap(vec[0], vec[j]);}}
}
4降序的实现方式
如果是从大到小只需要改变上面各式子的交换条件将若大于交换改成若小于交换即可
如在1的中bubble_sort_high(vector <int> vec)中将if (vec[j] > vec[j + 1])改成if (vec[j] < vec[j + 1])
5判断排序是否完成的方式
同时我们发现以上的式子存在一点小缺陷,即不可以判断排序是否完成,在排序完成后还会继续比较,造成一些计算浪费,为了解决这个问题,我们可以设计以下的方法判断排序是否完成,可以让我们提前结束循环
使用bool类型来判断是否排序完成,其原理为当一轮j循环不需要交换任何数是,每一个下一位的数都比上一位大,此时所有排序完成,不需要进行下一步的排序
!注意这种方法在2中的bubble_sort_low(vector <int> vec)并不适用,如反例 1 2 3 5 4这个中开头是1
bool is_sorted = false;int bubble_sort_judge(vector <int> vec){for (int i = 0;i < vec.size() - 1;i++){is_sorted = true;for (int j = 0;j < vec.size() - 1 - i;j++){if (vec[j] > vec[j + 1]){swap(vec[j], vec[j + 1]);is_sorted = false;}}if (is_sorted)break;}}
超详细的C++冒泡排序(升降)的两种实现方式相关推荐
- c语言实现路由功能,前端路由的两种实现方式,内附详细代码
一.前端路由介绍 前端路由主要应用在SPA(单页面开发)项目中.在无刷新的情况下,根据不同的URL来显示不同的组件或者内容. 前端路由的实现原理 : hash值 + onhashchange事件 hi ...
- 前端与后端,顶象设备指纹的两种接入方式
在如今的移动互联网时代,用户上网的设备多元化.连接互联网的渠道多样化.接入服务的地点任意化,用户的操作行为个性化,用户设备更加难以被识别和跟踪,由此给广大开展数字化业务的企业,尤其互联网企业带来全新的 ...
- redis的两种持久化方式详解
一.背景 在实际开发中,为了保证数据的完整性,防止数据丢失,我们除了在原有的传统数据库保存数据的同时,最好是再用redis持久化再保存一次数据.如果仅仅是使用redis而不进行持久化配置的话,当red ...
- Web APi之认证(Authentication)两种实现方式【二】(十三)
前言 上一节我们详细讲解了认证及其基本信息,这一节我们通过两种不同方式来实现认证,并且分析如何合理的利用这两种方式,文中涉及到的基础知识,请参看上一篇文中,就不再叙述废话. 序言 对于所谓的认证说到底 ...
- kotlin for android----------MVP模式下(OKHttp和 Retrofit+RxJava)网络请求的两种实现方式...
2019独角兽企业重金招聘Python工程师标准>>> 今天要说的干货是:以Kotlin,在MVP模式下(OKHttp和 Retrofit+RxJava)网络请求两种实现方式的一个小 ...
- Windows校验文件哈希hash的两种常用方式
大家经常都到哪儿去下载软件和应用程序呢?有没想过下载回来的软件.应用程序或资源是否安全呢?在 Windows 10 和 Office 2016 发布当初,很多没权限的朋友都使用第三方网站去下载安装映像 ...
- a - 数据结构实验之串一:kmp简单应用_串的两种模式匹配方式(BF/KMP算法)
串的两种模式匹配方式(BF/KMP算法) 前言 串,又称作字符串,它是由0个或者多个字符所组成的有限序列,串同样可以采用顺序存储和链式存储两种方式进行存储,在主串中查找定位子串问题(模式匹配)是串中最 ...
- 一文读懂工业设备的两种通讯方式:现场总线和工业以太网
随着传统制造企业正在加快智能制造转型的进程,工业互联网迅速在全世界范围内兴起.在工业互联网的技术构架中,通过各类通讯方式接入不同设备.系统和产品,来采集海量数据是其重要的一环.本文将重点介绍工业底层设 ...
- 初始化一个java空数组_Java 数组的两种初始化方式
一.数组 1.数组中存储元素的类型是统一的,每一个元素在内存中所占用的空间大小是相同的,知道数组的首元素的内存地址,要查找的元素只要知道下标,就可以快速的计算出偏移量,通过首元素内存地址加上偏移量,就 ...
最新文章
- 在Ubuntu 14.04 64bit上搭建Scala开发环境
- 接到面试通知你该做什么?
- 2016年3月26日作业
- MySQL中TIMESTAMPDIFF和TIMESTAMPADD函数
- OpenStack Heat 如何来实现和支持编排
- C# 二进制字节流查找函数IndexOf
- [转] WinForm实现移除控件某个事件的方法
- 多线程——NSThread、GCD、NSOperation
- [爬虫-python] scrapy框架入门实例-百度贴吧
- ReentrantLock与synchronized的区别(最直观)
- 拳王虚拟项目公社:2020年虚拟资源项目的最新正确玩法
- beast php,windows php-beast 安装
- Android Studio “Project Structure”选项目录结构显示异常
- 苹果发布会新品曝光 这款软件肯定用得上
- 如何高效填写软件测试缺陷报告?(送缺陷报告模板)
- js 迅雷 批量下载
- Android 6.0 Phone 多方通话流程
- 奇技淫巧玄妙无穷| M1 mac os(苹果/AppleSilicon)系统的基本操作和设置
- MySQL(面试+原理)(1)--MySQL是如何存储数据的
- 如何使用MATLAB将两张或者多张figure图形合并到一个figure图形里进行对比