c++之选择排序和冒泡排序实现
1.冒泡排序
冒泡排序就是通过对比前一个和后一个数的大小,按照规则进行顺序的调换。每一轮对比之后最大或者最小值都会浮到最上面或者沉到最低下。
如:对这一数组进行冒泡排序:int a[5]{34,12,56,4,7}; 假设为从小到大排序
一共需要比较length-1轮:
第一轮: a.34和12比较,12比34小,那么调换位置,此时为:12,34,56,4,7,然后在对该序列进行排序
b.然后就是34和56进行对比,34比56小,不用调换顺序,此时依旧为:12,34,56,4,7,然后在对该序列进行排序
c.然后再就是56和4鸡西宁对比,4比56小,所以将56和4调换顺序,此时序列就是:12,34,4,56,7
d.再然后就对比56和7,7比56小,所以将二者位置进行调换,此时完成第一轮调换,序列为:12,34,4,7,56
我们可以看到第一轮排序之后,已经将序列中的最大值沉到最底部了。
第二轮:此时的排序此时交第一轮要减1,
a.先是12和34对比,前者比后者小,所以不用调换位置,序列时:12,34,4,7,56
b.然后比较34和4的大小,后者比前者小,所以调换位置,此时序列为:12,4,34,7,56
c.再然后比较34和7的大小,后者比前者小,所以调换位置,此时序列为:12,4,7,34,56
d.此时就不用在往下比较了,因为比较次数已经减1了,也是因为第一轮中已经将最大的数选出来了。
然后就是第三轮和第四轮的比较,方法类似。
最终结果就是4,7,12,34,56
我们可以看到程序截图如下图所示:
2.选择排序
选择排序的实现要比冒泡排序简单一些,但是在代码上相对会有些绕。原理就是先假设待排序的序列中的第一个数为最小值或者最大值,这里还是用从小到大的顺序进行排序。首先假设第一个数为最小值(假设该值的索引下标时i),然后从该值的下一个数也就是索引为i+1的数开始进行比较,如果i+1的值要比假设的最小值小,那么就将二者的值进行交换,每一轮将最小值选择出来,并将其与假设的最小值进行调换就行,不需要想冒泡排序那样整个需略都要跟着一起移动。此时还需要一个缓冲变量来存放最小值的索引值。
详细讲解:
在时间复杂度上,这两种排序方法都是一样,O(N^2),也是需要循环执行length-1轮。还是假设对数组a进行排序。
首先定义数组:int a[5]{34,12,56,4,7};
第一轮:先假设序列中的第一个数是最小值,记录下它的索引值,定一个新的变量用来存放该索引值,minIndex=0,下表为0也就是第一个数。然后在进行循环。
a.内循环中的第一轮是34和12进行比较,后者比前者小,所以将minIndex的索引值进行更改,此时minIndex=1,
b.内循环中的第二轮,是利用minIndex 中的数和下一个待比较的数进行比较,应该是12和56比较,后者比前者小,所以不用修改minIndex的值
c.内循环中的第三轮,还是利用索引为1的数值和下一个待比较的数进行比较,应该是12和4进行比较,后者较之前者较小,所以记录下当前数的索引值并赋值给minIndex,此时minIndex=3
d.内循环中的第四轮,利用minIndex索引值的数值和下一个待比较的数进行比较,应该是4和7进行比较,后者比前者大,所以不用修改minIndex的值
然后将序列中的第i个数和序列中索引值为minIndex的数进行调换,第一轮已将最小值选择出来了。此时序列为:4,12,56,34,7
第一轮外循环之后,minIndex=3,下一轮外循环会将这个值直接覆盖
第二轮:此时的minIndex=1,假设的最小值是12
此时定义上一轮外循环的下一个数为最小值,也即是索引值为1的值,那么本轮循环将从索引值为2的数开始比较,
a.内循环中的第一轮,比较12和56,后者比前者大,所以不用修改minIndex的值,
b.内循环中的第二轮,此时比较12和34的大小,还是依旧不用修改索引值
c.内循环中的第三轮,此时比较12和7的大小,后者比前者小,索引记录下当前数的索引值并赋值给minIndex记录下来
内循环结束,判断minIndex的值是否被改变,如果被改变了,那么就将下标为i的数和下标为minIndex的数进行交换。此时序列为:4,7,56,34,12且minIndex=4
第三轮和第四轮外循环的规则类似。。
我们可以看程序运行的效果图如下:
最后附上可供运行的c++代码:
#include <iostream> #include <iomanip> using namespace std; int main() { // bubble sort double a[5]={34,12,56,4,7}; int len = sizeof(a) / sizeof(double); //output all numbers cout << "before sorted by bubbleSort:" <<endl; for (int i=0;i<len;i++) { cout << a[i]<<"\t"; } cout << endl; //start to sort the array for (int i=0;i<len-1;i++) { for(int j=0;j<len -i -1;j++) { if(a[j]>a[j+1]) { double t = 0; t = a[j]; a[j] = a[j+1]; a[j+1] = t; } } cout << "This is at NO." << i << "time: "; for(int i=0;i<len;i++) cout << a[i] << "\t"; cout << endl; } //output after sorted cout << "after sorted by bubbleSort:"<<endl; for (int i=0;i<len;i++) { cout << a[i]<<"\t"; } cout << endl; //selectsort double b[5]={34,12,56,4,7}; cout << "before sorted by selectSort:" << endl; for (int i=0;i<len;i++) { cout << b[i]<< "\t"; } cout << endl; //start to selectSort for(int i=0;i<len-1;i++) { int minIndex = i;//pretend the first number of the array be the min number.and record the index cout << "ending->minIndex=" << minIndex << endl; for (int j=i+1;j<len;j++) { if(b[minIndex]>b[j]) { minIndex = j; } } if(minIndex != i) { double t = 0; t = b[i]; b[i] = b[minIndex]; b[minIndex] = t; } //print the detail cout << "This is at NO." << i << "time: "; for(int i=0;i<len;i++) cout << setw(4)<<b[i] ; cout << " "<< "ending->minIndex=" << minIndex << endl; } cout << "after sorted by selectSort:" << endl; for (int i=0;i<len;i++) { cout << b[i]<<"\t"; } cout << endl; return 0; }
c++之选择排序和冒泡排序实现的更多相关文章
- 算法——蛮力法之选择排序和冒泡排序c++实现
这次实现的是蛮力法中的两个例子,选择排序法和冒泡排序法,使用的编译环境是vs2013,下面对这两个算法做一个简单介绍,然后是两个算法的c++实现代码. 选择排序法比较的范围是整个列表,每次扫描结束找出 ...
- java 选择排序、冒泡排序、折半查找
public class SortAndSelectDemo{ public static void main(String[] args){ int[] arr = {3, 5, 17, 2, 11 ...
- C语言排序算法之简单交换法排序,直接选择排序,冒泡排序
C语言排序算法之简单交换法排序,直接选择排序,冒泡排序,最近考试要用到,网上也有很多例子,我觉得还是自己写的看得懂一些. 简单交换法排序 /*简单交换法排序 根据序列中两个记录键值的比较结果来对换这两 ...
- Java-数据结构与算法-选择排序与冒泡排序
Java 选择排序与冒泡排序 1.DataSorter.java public class DataSorter { //冒泡排序法 //主要思路:按升序排序,数组元素两两比较,大的立即排后面 pub ...
- java 选择排序与冒泡排序
选择排序与冒泡排序的特点与区别 ++++++++++++++++++++++++++++++++++++++++++++++ 选择排序 这一种简单的排序方法,它的基本思想是:R[n]第一次从R[0]~ ...
- 【java基础】选择排序and冒泡排序
前言 : 今天学习的是J2SE视频里的第五章,数组部分,它里面留了一个经典的作业,就是让我们去从1倒9按一定规格排序,这让我想起了学习vb的时候最最让我头疼的两种排序方法,选择排序法 和 冒泡排序法. ...
- 关于Java中的选择排序法和冒泡排序法
一,这种方法是直接传入一个数组进行排序(选择排序法) public static void selectSort(int arr[]){ for (int i = 0; i < arr.leng ...
- C#算法 选择排序、冒泡排序、插入排序
1.冒泡排序: 方法一: public static int[] MaoPao(int[] arr) { //执行多少次 for (int i = 0; i < arr.Length; i++) ...
- Java中选择排序,冒泡排序,插入排序,快速排序
一:冒泡法排序 //冒泡排序 注:从小到大排 //特点:效率低,实现简单 //思想:每一趟将待排序序列中最大元素移到最后,剩下的为新的待排序序列,重复上述步骤直到排完所有元素. 这只是冒泡排序 ...
- 基本的排序算法C++实现(插入排序,选择排序,冒泡排序,归并排序,快速排序,最大堆排序,希尔排序)
博主欢迎转载,但请给出本文链接,我尊重你,你尊重我,谢谢~http://www.cnblogs.com/chenxiwenruo/p/8529525.html特别不喜欢那些随便转载别人的原创文章又不给 ...
随机推荐
- 微信小程序通讯录首字母索引效果,车辆品牌选择列表
效果图: wxml代码: <block wx:for="{{list}}"> <view class='letter' id="letter{{inde ...
- 基于 Web 的远程 Terminal 模拟器安装使用详解
http://lzw.me/a/shellinabox.html 一.Shellinabox 简介 Shellinabox 是一个基于 web 的终端模拟器,采用 C 语言编写,使用 Ajax 与后端 ...
- Python爬虫进阶四之PySpider的用法
审时度势 PySpider 是一个我个人认为非常方便并且功能强大的爬虫框架,支持多线程爬取.JS动态解析,提供了可操作界面.出错重试.定时爬取等等的功能,使用非常人性化. 本篇内容通过跟我做一个好玩的 ...
- asp.net网站全局控制文件内注册事件
在管理ASP.NET网站的时候,有时会对网站整体做出控制,这时把这些代码写在global.asax内可以做到全局控制. 未添加任何代码的global.asax文件如下: <script runa ...
- 在Word 中撰写并发布到博客的帮助
目前大部分的博客作者在用Word写博客这件事情上都会遇到以下3个痛点: 1.所有博客平台关闭了文档发布接口,用户无法使用Word,Windows Live Writer等工具来发布博客.使用Word写 ...
- StretchBlt函数和BitBlt函数的用法
StretchBlt和BitBlt都用在双缓冲视图中,用来显示一幅图像 一.StretchBlt 函数从源矩形中复制一个位图到目标矩形,必要时按目标设备设置的模式进行图像的拉伸或压缩.也即是将内存中的 ...
- 开源WebGIS实施方案(四):GeoServer发布PostGIS数据
GeoServer可以支持多种格式的数据源,本文只介绍其中一种,即PostGIS数据源. 新建一个工作区.工作区这个名字也是一变再变,早前叫做目录,后来改为工作空间,如今已变为工作区了. 添加数据存储 ...
- Sqlserver 密码过期时间查询
DECLARE @login nvarchar(30) -- 查询设定密码过期的登陆账号SELECT @login = nameFROM sys.sql_loginsWHERE is_expirati ...
- web开发有那些牛逼东西可以用
1.squid 缓存网页 2.Pingdom 我使用Pingdom来验证Superexpert.com网站是否总是处在正常运行状态之中.你可以通过浏览“Pingdom.com”的方式来注册Pingdo ...
- kv数据库对比总结
集群型: hbase Cassandra scylladb redis类: redis + twemproxy codis 持久型: pika ssdb