排序算法之冒泡排序
来源:互联网 发布:压缩密码破解软件 编辑:程序博客网 时间:2024/05/29 19:05
冒泡排序(英语:Bubble Sort,台湾另外一种译名为:泡沫排序)是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。[1]
[2]
C++实例代码如下
#include <iostream>using namespace std;void BubbleSort(int arr[],int n)//n是数组长度{ for(int i=0;i<n;i++) for(int j=n-2;j>=i;j--) { if(arr[j]>arr[j+1]) { int temp=arr[j+1]; arr[j+1]=arr[j]; arr[j]=temp; } }}int main(){ const int n=9; int a[n]={3,5,2,4,7,9,8,1,6}; BubbleSort(a,n); cout << "After sorted : "; for(int k=0;k<n;k++) cout << a[k] << " "; return 0;}
于是得到以下结果
如果想仔细观察冒泡排序的每一步的过程,适当修改代码如下:
#include <iostream>using namespace std;void BubbleSort(int arr[],int n)//n是数组长度{ for(int i=0;i<n;i++) for(int j=n-2;j>=i;j--) { cout << "\n第" << i+1 << "轮," << n-1-j << "次冒泡 :"; if(arr[j]>arr[j+1]) { int temp=arr[j+1]; arr[j+1]=arr[j]; arr[j]=temp; } for(int k=0;k<n;k++) cout << arr[k] << " "; }}int main(){ const int n=9; int a[n]={3,5,2,4,7,9,8,1,6}; cout << "Before sorted : "; for(int k=0;k<n;k++) cout << a[k] << " "; BubbleSort(a,n); cout << "\nAfter sorted : "; for(int k=0;k<n;k++) cout << a[k] << " "; return 0;}
得到结果如下:
从数字的移动可以看出,冒泡排序之冒泡的含义了。
从上面的图也可以看出,第三轮,在已经排好序的情况下,冒泡排序仍然在继续排序,所以该算法效率的确不高。可以考虑设置一个布尔标记量,当第二个for循环里面已经排好序,无需再进入第一个for循环。
于是稍微修改一下:
#include <iostream>using namespace std;void BubbleSort(int arr[],int n)//n是数组长度{ bool flag=true; for(int i=0;i<n&&flag;i++) for(int j=n-2;j>=i;j--) { flag=false; cout << "\n第" << i+1 << "轮," << n-2-j << "次冒泡 :"; if(arr[j]>arr[j+1]) { int temp=arr[j+1]; arr[j+1]=arr[j]; arr[j]=temp; flag=true; } for(int k=0;k<n;k++) cout << arr[k] << " "; }}int main(){ const int n=9; int a[n]={3,5,2,4,7,9,8,1,6}; cout << "Before sorted : "; for(int k=0;k<n;k++) cout << a[k] << " "; BubbleSort(a,n); cout << "\nAfter sorted : "; for(int k=0;k<n;k++) cout << a[k] << " "; return 0;}
结果如下:
下面来分析冒泡排序的时间复杂度。
- 最好的情况是完全正序。有了布尔标记量的情况下,此时只需要完成第一个for循环,需要O(n)次比较,无需进入下面的第二个for循环,因此时间复杂度是O(n)。
- 最坏的情况是逆序,对每一个i,都要循环n-i次,比较次数是O(n2),交换次数也是O(n2),因此时间复杂度是O(n2)。
参考文献
[1] [2] 冒泡排序维基百科
0 0
- 排序算法之冒泡排序
- 排序算法之冒泡排序
- 排序算法之冒泡排序
- 【排序算法】之冒泡排序
- 排序算法之冒泡排序
- 排序算法之冒泡排序
- 排序算法之冒泡排序
- 排序算法之冒泡排序
- 排序算法之冒泡排序
- 排序算法之冒泡排序
- 排序算法之冒泡排序
- 排序算法之冒泡排序
- 排序算法之冒泡排序
- 排序算法之冒泡排序
- 排序算法之冒泡排序
- 排序算法之-冒泡排序
- 排序算法之冒泡排序
- 排序算法之冒泡排序
- 为虚拟机硬盘扩容(Oracle VM VirtualBox)的方法啊
- libxml/tree.h file not found解决办法
- WIFI网络操作
- 用XE7新开发的一个Android员工积分查询的案例
- 轻量级网络请求框架MKnetworkKit 介绍使用
- 排序算法之冒泡排序
- Linux中find常见用法示例
- 《Apache MINA 2.0 用户指南》第十一章:SSL 过滤器
- volatile
- 【控件篇】Popuwindow 新手使用误区讲解
- R文件丢失以及包不存在的解决方法
- 【ADB命令第三篇】手机密码(访问权限密码或者锁屏密码等)忘记怎么办?
- lightoj 1326 - Race dp+预处理
- BestCoder Round #34