C语言学习之交换(冒泡)排序
在学习c语言的过程中,在数组内容中我们总是能学习到对一组数据进行排序,对于排序有许多的方法,像 (交换)冒泡排序、选择排序、(基数)桶排序、(插入)二分法排序等等。
我主要以我个人的理解去分析常见的交换(冒泡)排序,同时本人也是个新手,希望能以我的手笔让其他不懂的新手了解透这些排序。
交换(冒泡)排序:
又名为冒泡排序,即像水中的气泡一样冒出来,在数组中数组往一端移动可以形象说是冒泡,顾名思义啦。
下面就以 4 6 32 5 12 2 15 28 9 10 这10个数字为例,我们可以从小到大排序也可从大到小排序,原理都是一样的。现就以从小到大排序为例。
如下图、开始依次对相邻两个数进行比较,如果符合条件(此处从小到大排序,则是如果前一个数大于后一个数,那么这两个数字进行值的交换,否则保持值不变)则执行相应的操作。从图中可以看出两数比较最大的那个数就往后移(往后冒),这第一趟下来,最大的数就出来了,冒在数组的末端。那么就剩下前面的九个数进行两两比较了,相同的方式就可以依次找出第二大的数、第三大的数……这样进行九趟比较,这组数据排序就好了。
代码如下 :
#include"stdio.h"
int main(void)
{
int i, j;
int temp;//临时变量
int a[] = {, , , , , , , , , };
for(i = ; i >= ; i--)
for(j = ; j <= i; j ++)
if(a[j] > a[j + ]){//满足条件则交换两值
temp = a[j];
a[j] = a[j + ];
a[j + ] = temp;
}
for(i = ; i < ;i ++)
printf("%d ",a[i]);
}
众所周知,几乎任何事物都有两面性,好与坏、利与弊。
那么这种排序的弊端,相信大家从上图应该看出来了。在第五趟的时候整个数组是排序好了,但是呢程序还是往下执行。这样不仅浪费时间,还占用空间(虽然现在计算机的空间大、运算速度也快)。同时这种方法在处理大量数据时可能吃不消,这里只是10组数,就要比较9 趟。当然这个是可以进行优化的,我们可以加入一个标示 flag 如果在之前的比较中进行了数值的交换则说明顺序还没有排好那么继续进行,否则就说明已经排序了,这里就可以 break 了。
代码如下:
#include"stdio.h"
int main(void)
{
int i, j;
int temp, flag = ;//标志 flag 赋值为 0
int a[] = {, , , , , , , , , };
for(i = ; i >= ; i--){
for(j = ; j <= i; j ++)
if(a[j] > a[j + ]){
temp = a[j];
a[j] = a[j + ];
a[j + ] = temp;
flag ++;//如果进行了值的交换则改变标志flag的值
}
if(flag == )
break;//如果标志flag的值未变化,则说明已经排序好,那么就可以终止了
flag = ;//重置flag 值以进行下一趟比较
}
for(i = ; i < ;i ++)
printf("%d ",a[i]);
}
当然,这种排序方式的优点就是稳定,不管有多少数组,只要给定足够空间和时间,就能完整无误地排序好。如果数据足够大的话还是不怎么推荐此排序方法。以上代码中简单以10个数为例对其进行排序,你可以依葫芦画瓢变更一下代码中变量就可以了。
本人新手,希望本篇文章能对你有所帮助,如有疑问、错误、更好的思路可进行留言评论。最后感谢你能在成千上万的文章中浏览到此篇 ^-^
C语言学习之交换(冒泡)排序的更多相关文章
- C语言排序算法学习笔记——交换类排序
交换类排序:根据序列中两个元素关键字的比较结果来交换他俩在序列中的位置. 冒泡排序:假设待排序表长为n,从后往前(或从前往后)两两比较相邻元素的值,若为逆序(即A[i-1]>A[i])则交换他们 ...
- Go语言学习之5 进阶-排序、链表、二叉树、接口
本节主要内容: 1. 结构体和方法2. 接口 1. 结构体和方法 (1). 用来自定义复杂数据结构 (2). struct里面可以包含多个字段(属性) (3). struct类型可以定 ...
- C语言学习之桶排序
之前的博文写了交换(冒泡)排序.选择排序,本文就写写桶排序.不过我理解的这样不算是真正上的桶排序,我的比较简单而真正的桶排序是比较复杂的,暂且就叫桶排序吧. 桶排序在排序中应该用的不多吧,个人理解的是 ...
- C语言排序算法之简单交换法排序,直接选择排序,冒泡排序
C语言排序算法之简单交换法排序,直接选择排序,冒泡排序,最近考试要用到,网上也有很多例子,我觉得还是自己写的看得懂一些. 简单交换法排序 /*简单交换法排序 根据序列中两个记录键值的比较结果来对换这两 ...
- 12天学好C语言——记录我的C语言学习之路(Day 6)
12天学好C语言--记录我的C语言学习之路 Day 6: 今天,我们要开始学习数组了. //①数组部分,数组的大小不能够动态定义.如下: //int n; scanf("%d,& ...
- C语言学习书籍推荐《学通C语言的24堂课》下载
下载地址:点我 编辑推荐 <学通C语言的24堂课>:用持续激励培养良好习惯以良好习惯铸就伟大梦想——致亲爱的读者朋友在开始学习<学通C语言的24堂课>的同时,强烈建议读者朋友同 ...
- 12天学好C语言——记录我的C语言学习之路(Day 12)
12天学好C语言--记录我的C语言学习之路 Day 12: 进入最后一天的学习,用这样一个程序来综合考量指针和字符串的关系,写完这个程序,你对字符串和指针的理解应该就不错了. //输入一个字符串,内有 ...
- 12天学好C语言——记录我的C语言学习之路(Day 11)
12天学好C语言--记录我的C语言学习之路 Day 11: 因为指针部分比较的难,所以我们花费的时间也是最长的,希望大家耐的住性子,多多理解,多多打代码.好了,废话不多说,来看第11天的学习. //编 ...
- 12天学好C语言——记录我的C语言学习之路(Day 9)
12天学好C语言--记录我的C语言学习之路 Day 9: 函数部分告一段落,但是我们并不是把函数完全放下,因为函数无处不在,我们今后的程序仍然会大量运用到函数 //转入指针部分的学习,了解指针是什么 ...
随机推荐
- Oracle COMMIT语句的处理顺序
Oracle COMMIT语句相信大家都有一定的了解,下面就为您介绍Oracle COMMIT语句的处理步骤,希望对您能有所帮助. Oracle COMMIT语句处理顺序 当事务提交时,Oracle分 ...
- CSS(一) 引入方式 选择器 权重
Css(一) Cascading Style Sheet 层叠样式表 css注释方式/* */ 一.Css引入方式 1. 行间样式 style=" key:value; " &l ...
- .NET(c#) 移动开发平台 - Smobiler(1)
如果说基于.net的移动开发平台,目前比较流行的可能是xamarin了,不过除了这个,还有一个比xamarin更好用的国内的.net移动开发平台,smobiler,不用学习另外一套开发模式或者搭建复杂 ...
- 记录一下自己爬虎牙LOL主播的爬虫思路
1.明确爬虫目的 爬虫目的需要我们明确的,没有目的的爬虫都是耍流氓!像我这次爬虫目的能不能从网页上爬下来. 2.怎么来爬? a. 先要找到具有唯一性的标签 <li class="gam ...
- Matlab与C++混合编程(依赖OpenCV)
Matlab与C++混合编程实际上就是通过Matlab的Mex工具将C++的代码编译成Matlab支持调用的可执行文件和函数接口.这样一方面可以在Matlab中利用已经编写好的函数,尽管这个函数是用C ...
- 一步一步从原理跟我学邮件收取及发送 2.邮箱的登录和绕不开的base64
一步一步从原理跟我学邮件收取及发送 2.邮箱的登录和绕不开的base64 好了,经过本系列上一篇文章 "1.网络命令的发送",假设大家已经掌握了 email 电子邮件的命令发送的方 ...
- burpsuite截断上传webshell
1.先设置好代理127.0.0.1 8080 2.开启截断模式 3.上传文件会被burp截断 4.在hex下找到你上传的webshell的16进制编码 5.把.后面的源码改为00 点击forward上 ...
- 51Nod 1003 阶乘后面0的数量(数学,思维题)
1003 阶乘后面0的数量 基准时间限制:1 秒 空间限制:131072 KB 分值: 5 难度:1级算法题 n的阶乘后面有多少个0? 6的阶乘 = 1*2*3*4*5*6 = 720 ...
- Gym100814B Gym100814F Gym100814I(异或) ACM International Collegiate Programming Contest, Egyptian Collegiate Programming Contest (2015) Arab Academy for Science and Technology
今日份的训练题解,今天写出来的题没有昨天多,可能是因为有些事吧... Gym100814B 这个题就是老师改卷子,忘带标准答案了,但是他改了一部分卷子,并且确定自己改的卷子没出错,他想从改过的卷子里把 ...
- BC#65T4 ZYB's Tree
题目:http://acm.hdu.edu.cn/showproblem.php?pid=5593 点分治被卡了TAT... 正解是dp,可以按层数考虑dp,先预处理跑一边dfs得到子树各层数点数大小 ...