引言
只要设计到数据,就会涉及到数据的排序问题,比如给你随机给你五个整数 3,1,5,2,4 。让你从小到大进行排序,那我们该怎样才是实现对这些整数的排序呢 ?
答案是多种多样的,比如用冒泡排序、选择排序、堆排序、归并排序、快速排序等等,这些排序方法都可以实现对整数排序,而这篇文章要讲的就是冒泡排序
本文将从以下几个问题对冒泡排序进行分析和讲解:
- 什么是冒泡排序?
- 冒泡排序的大概过程是什么?
- 怎样用代码实现冒泡排序?
- 冒泡排序的代码详解。
一、什么是冒泡排序?
下面看百度百科对冒泡排序的定义:
冒泡排序(Bubble Sort),是一种计算机科学领域的较简单的排序算法。
它重复地走访过要排序的元素列,依次比较两个相邻的元素,如果顺序(如从大到小、首字母从Z到A)错误就把他们交换过来。走访元素的工作是重复地进行直到没有相邻元素需要交换,也就是说该元素列已经排序完成。
这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端(升序或降序排列),就如同碳酸饮料中二氧化碳的气泡最终会上浮到顶端一样,故名“冒泡排序”。
冒泡冒泡,顾名思义它的排序过程就像冒泡一样,它的基本思想就是:对所有的数进行查找,找到最大的数放到最后面, 接下来除了那个最大的数,再对剩余的数进行查找,把剩余的数中最大的数放到倒是第二后面,直到所有的数都排序完成。
二、冒泡排序的大概过程是什么?
下面拿一个例子说明冒泡排序的大概过程。
冒泡排序的基本思想就是:首先选出来最大的数放到最后面,再选出来第二大的放到最大的数前面,按照前面的方法直到排序完成。
下面来说用冒泡排序对3,1,5,2,4进行排序(从小到大排序)
- 我们首先要选出来这个五个数中最大,选择方法:首先看第一个数3和第二个数1,拿着3和1比较,发现3>1,交换他俩的位置,这时候这一组数就变成了1,3,5,2,4
- 再看交换后的第二个数3和第三个数5,发现3<5.符合从小到大,不用交换顺序。
- 再看交换后的第三个数5和第四个数2,发现5>2,交换他俩的位置,这时候这一组数就变成了1,3,2,5,4.
- 再看交换后的第四个数5和第五个数4,发现5>4,交换他俩的位置,这时候这一组数就变成了1,3,2,4,5
- 上面的这四步算是第一轮查找,把最大的数字5放到了最后面。下面在及性能第二轮查找
- 首先看第一个数1和第二个数3,发现1<3,符合条件,不用交换顺序
- 再看第二个数3和第三个数2,发现3>2,交换他俩的位置,这时候这一组数就变成了1,2,3,4,5。
- 再看第三个数3和第四个数4,发现3<4,符合条件,不用交换顺序。
- 到现在为止第二轮的查找结束(不用对第五个数5进行比较,因为他已经是最大的了),通过上面的6-8,把第二大的数4放到了倒数第二个位置。接下来按照上面方法再进行查找即可。
总结:假设一共有n个数,那么需要n-1上面的查找操作(每一次都会把 “最大的数放到后面”,等进行n-1一次之后,剩余的1个数不用比较也是最小的数了),而且每一次查找过程中,比较相邻两个数的次数还不一样,第一次需要比较n-1次,第二次需要n-2(最后一个数已经确定,不用比较了)。后面的每次查找都比前面查找的比较次数少一,即第i次查找过程,需要比较n-i次(重要!!!)。
下面再看一个网上冒泡排序的动图:
三、怎样用代码实现冒泡排序?
通过上面对3,1,5,2,4的排序过程讲解,我们需要明确已知的三个条件
- 我们要排序的数组有哪些数?数组长度为多少?
- 我们要查找的次数为多少?
- 每次查找,我们需要比较的次数为多少?
搞清楚了上面三个条件,我们下面看代码:
#include<iostream> using namespace std; //冒泡排序函数 稳定 void BubbleSort(int arr[],int len) { int temp; for(int i=0;i<len-1;i++) { for(int j=0;j<len-i-1;j++) { if(arr[j]>arr[j+1])//交换这两个数 { temp=arr[j]; arr[j]=arr[j+1]; arr[j+1]=temp; } } } } //输出数组的值 void printf(int arr[],int len) { for(int i=0;i<len;i++) cout<<arr[i]<<" "; cout<<endl; } int main() { //要排序的数组 int arr[]={3, 44,38, 5,47,15,36,26,27,2 ,46,4 ,19,50,48}; int len=15;//要排序的数组长度 //排序 BubbleSort(arr,len); //输出 printf(arr,len); return 0; }
运行结果:
四、冒泡排序的代码详解
- 上面代码写了两个函数,一个是printf函数,这个是输出排序后的数组。
- 另一个函数就BubbleSort函数,在这个函数里面有一个二重循环,外层循环的的次数就是要查找的次数,内层循环的次数的就是要比较的次数,刚好对应上面说的(这里数组下标是从0开始的)。
- 如果对上面代码有疑问,自己可以按照前面的过程,模拟一边对3,1,4,5,2的排序过程,就知道代码是怎样执行的了 。
本文参考以及引用:
如果对其他的算法还有兴趣,可以点击下面的链接。