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: 函数部分告一段落,但是我们并不是把函数完全放下,因为函数无处不在,我们今后的程序仍然会大量运用到函数 //转入指针部分的学习,了解指针是什么 ...
随机推荐
- Percona Toolkit 2.2.19 is now available
New Features: 1221372: pt-online-schema-change now aborts with an error if the server is a slave, be ...
- 转- 在ubuntu下安装Nginx
一. 安装包安装 1.1 安装Nginx $sudo apt-get install nginx Ubuntu安装之后的文件结构大致为: 所有的配置文件都在/etc/nginx下,并且每个虚拟主机已经 ...
- windows如何向阿里云服务器传递文件
一,前提说明 最近搞了一个阿里云服务器玩玩,打算自己搞一个小网站什么的. 然后再阿里云上花9.9买了半年的服务器. 服务器版本是 ubuntu_16_04. 二.目标是往阿里云服务器上上传本地文件. ...
- Oracle 11G Client 安装就可以用上Oracle11G啦,不用傻傻的安装2G多的Oracle啦,安装特别简单,使用起来更简单
下载地址: http://download.oracle.com/otn/nt/oracle11g/112010/win32_11gR2_client.zip 先将下载下来的ZIP文件解压,并运行se ...
- Gym 100952D&&2015 HIAST Collegiate Programming Contest D. Time to go back【杨辉三角预处理,组合数,dp】
D. Time to go back time limit per test:1 second memory limit per test:256 megabytes input:standard i ...
- NowCoder牛客练习赛7-A.骰子的游戏 B.购物-优先队列
A.骰⼦的游戏 时间限制:C/C++ 1秒,其他语言2秒空间限制:C/C++ 32768K,其他语言65536K64bit IO Format: %lld 题目描述 在Alice和Bob面前的是两个骰 ...
- HDU4920-Matrix multiplication-矩阵乘法 51nod-1137 矩阵乘法
先贴两个基础的矩阵乘法,以后再贴一些题. hdu. Matrix multiplication Time Limit: 4000/2000 MS (Java/Others) Memory Lim ...
- HDU6235-Permutation-水题-2017中国大学生程序设计竞赛-哈尔滨站-重现赛
Permutation Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others)Tot ...
- Hbuilder实用技巧
转自:http://blog.csdn.net/qq_34099161/article/details/51451712 1. Q:怎么实现代码追踪? A:在编辑代码时经常会出现需要跳转到引用文件或者 ...
- JavaScript实现职责链模式
什么是职责链模式 职责链模式的定义是:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系,将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止.举个例子:当你从公 ...