冒泡排序详解
来源:互联网 发布:人工智能再成风口 编辑:程序博客网 时间:2024/06/06 02:13
先来看一下代码,然后再逐行对照解释,这代码是将number[5] = {5, 4, 3, 2, 1}数组里的数由小到大排列
#include <stdio.h>int main(){ int n=5; int number[n] = {5, 4, 3, 2, 1}; int i, j, temp; for (j = 0; j < n - 1; j++) //外循环 (因为j从0开始,所以要减1) for (i = 0; i < n - j - 1; i++) //内循环 (因为i从0开始,所以要减1) { //比较两个数的大小,如果前面的数大于后面的就交换 if(a[i] > a[i + 1]) { temp = a[i]; a[i] = a[i + 1]; a[i + 1] = temp; } }}
外循环第一轮(j=0)时:
内循环开始前后原数组:5,4,3,2,1
内循环第1轮后(i=0):4,5,3,2,1
内循环第2轮后(i=1):4,3,5,2,1
内循环第3轮后(i=2):4,3,2,5,1
内循环第4轮后(i=3):4,3,2,1,5
外循环第二轮(j=1)时:
内循环开始前后原数组:4,3,2,1,5
内循环第1轮后(i=0):3,4,2,1,5
内循环第2轮后(i=1):3,2,4,1,5
内循环第3轮后(i=2):3,2,1,4,5
….
可以看出,第一轮外循环后,把数组中最大的数“5”排到最后,整个内循环过程就像气泡一样一层层往上升。第一轮外循环已经把数组中最大的数拍到最后了,就不用理它了,进入第二轮外循环(j=1),此时内循环只需比较前4(即n - j)个数就行了,以此类推,第二轮外循环把“4”升到顶端,第三轮外循环把“3”升到顶端,第四轮外循环把“2”升到顶端。因为有数组5个数,所以n=5,这样基础的冒泡排序算法就算完成了,可以看出,冒泡排序具有代码简洁、容易理解等优点。
但是!
如果数组的初始值是number[5] = {5, 1, 2, 3, 4},用上面说的冒泡排序,只需要一轮外循环,整个数组就能实现由小到大排序,但是代码并不知道已经排序好了,还会继续进行第2、3、4轮外循环,这样一来,冒泡排序效率不高的缺点就显露出来了,当数据量很大时,就会耗费很多无用的时间。那下面就来看看用什么方法解决这个问题:
其实这个问题也很好解决,只需要做一个标记,如果已排序好就做标记,根据标记退出循环。看下面代码:
#include <stdio.h>int main(){ int n=5; int number[n] = {5, 4, 3, 2, 1}; int i, j, temp; bool b; //新增一个布尔变量 for (j = 0; j < n - 1; j++) //外循环 (因为j从0开始,所以要减1) b=false;// 每次先重置为false for (i = 0; i < n - j - 1; i++) //内循环 (因为i从0开始,所以要减1) { //比较两个数的大小,如果前面的数大于后面的就交换 if(a[i] > a[i + 1]) { temp = a[i]; a[i] = a[i + 1]; a[i + 1] = temp; } b=true;//如果还进行过交换设为true } //如果上一次没有经过交换,则说明已排好序,b=false,退出外循环 if(!b){ break; }}
- 排序详解:冒泡排序
- 冒泡排序(bubble_sort)详解
- 冒泡排序详解
- PHP冒泡排序详解
- 冒泡排序详解
- 冒泡排序原理详解
- 详解冒泡排序
- 冒泡排序深入详解
- 冒泡排序代码详解
- 冒泡排序算法详解
- 【17】-冒泡排序详解
- 冒泡排序详解
- java冒泡排序详解
- 冒泡排序详解
- 冒泡排序详解
- 冒泡排序算法详解
- 冒泡排序详解
- 冒泡排序详解
- utf-8 和 unicode
- 算法作业_33(2017.6.16第十七周)(算法机考模拟题1)
- 5. Longest Palindromic Substring
- EAP学术论文写作笔记
- 2016年最值得学习的五大开源项目
- 冒泡排序详解
- UIDebuggingInformationOverlay使用介绍
- WebGL笔记_光(二)
- 一些我在Leanote写的题解
- POJ 2097 Drawing Windows 笔记
- arcgis获取唯一值实践及总结
- JavaScript的装饰器:它们是什么及如何使用
- MDX查询基础(一)
- How does Trepn Power measure battery power?