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: 函数部分告一段落,但是我们并不是把函数完全放下,因为函数无处不在,我们今后的程序仍然会大量运用到函数 //转入指针部分的学习,了解指针是什么 ...
随机推荐
- SQLite事务与自增深度分析
SQLite什么都好,就怕“database is locked”这些年来想尽办法去规避它. 测试代码: static void Test2() { XCode.Setting.Current.Tra ...
- Java多线程同步问题:一个小Demo完全搞懂
版权声明:本文出自汪磊的博客,转载请务必注明出处. Java线程系列文章只是自己知识的总结梳理,都是最基础的玩意,已经掌握熟练的可以绕过. 一.一个简单的Demo引发的血案 关于线程同步问题我们从一个 ...
- 从头开始基于Maven搭建SpringMVC+Mybatis项目(2)
接上文内容,本节介绍Maven的聚合和继承. 从头阅读传送门 互联网时代,软件正在变得越来越复杂,开发人员通常会对软件划分模块,以获得清晰的设计.良好的分工及更高的可重用性.Maven的聚合特性能把多 ...
- AC自动机讲解
今天花了半天肝下AC自动机,总算啃下一块硬骨头,熬夜把博客赶出来.. 正如许多博客所说,AC自动机看似很难很妙,而事实上不难,但的确很妙.笼统地说,AC自动机=Trie+KMP,但是仅仅知道这个并没有 ...
- Java中import及package的用法
有些人写了一阵子 Java,可是对於 Java 的 package 跟 import 还是不 太了解很多人以為原始码 .java 档案中的 import 会让编译器把所 import 的程式通通写到编 ...
- 【Java学习笔记之十九】super在Java继承中的用法小结
1)有人写了个很好的初始化属性的构造函数,而你仅仅想要在其中添加另一些自己新建属性的初始化,这样在一个构造函数中调用另外一个构造函数,可以避免重复的代码量,减少工作量: 2)在一个构造函数中调用另外一 ...
- bzoj4332;vijos1955:JSOI2012 分零食
描述 这里是欢乐的进香河,这里是欢乐的幼儿园. 今天是2月14日,星期二.在这个特殊的日子里,老师带着同学们欢乐地跳着,笑着.校长从幼儿园旁边的小吃店买了大量的零食决定分给同学们.听到这个消息,所有同 ...
- HDU 1010 Tempter of the Bone【DFS经典题+奇偶剪枝详解】
Tempter of the Bone Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Othe ...
- UESTC30-最短路-Floyd最短路、spfa+链式前向星建图
最短路 Time Limit: 3000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) 在每年的校赛里,所有进入决赛的同 ...
- 关于win10系统安装VMware12Pro后,win10系统的 控制面板\网络和 Internet\网络连接\更改适配器选项卡中 没有虚拟网卡VMnet1和VMnet8图标,该如何把他们显示出来呢?
安装VMware12Pro后,PC主机通过命令行:ipconfig/all ,查看发现没有VMnet1和VMnet8. 然后我首先尝试打开VMware12Pro的虚拟网络编辑器: 然后先点击" ...