八大排序算法之五--交换排序—冒泡排序(Bubble Sort)
Posted 泡面小王子
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了八大排序算法之五--交换排序—冒泡排序(Bubble Sort)相关的知识,希望对你有一定的参考价值。
基本思想:
在要排序的一组数中,对当前还未排好序的范围内的全部数,自上而下对相邻的两个数依次进行比较和调整,让较大的数往下沉,较小的往上冒。即:每当两相邻的数比较后发现它们的排序与排序要求相反时,就将它们互换。
算法实现:(HDU 1040 亲测 AC)
#include<iostream> using namespace std; const int N =1005; void BubbleSort(int a[],int ); void print(int a[],int num); void swap(int &a,int &b); int main() { int s[N]; int T; cin>>T; while(T--) { int n; cin>>n; for(int j=0;j<n;j++) cin>>s[j]; BubbleSort(s,n); print(s,n); cout<<endl; } return 0; } void BubbleSort(int a[],int num)//冒泡排序算法 { for(int i=0;i<num-1;i++) { for(int j=0;j<num-i-1;j++) { if(a[j]>a[j+1]) { swap(a[j],a[j+1]); } } } } void swap(int &a,int& b)//交换元素 { int temp; temp=a; a=b; b=temp; } void print(int a[],int n)//输出数组元素 { cout<<a[0]; for(int k=1;k<n;k++) { cout<<" "<<a[k]; } }
n个数排序 比较趟数为n-1次
算法时间复杂度:O(n2)
空间复杂度 :O(n)
改进版本:
上面的冒泡排序中每一趟排序操作只能找到一个最大值或最小值,但如果在每趟排序中进行正向和反向两遍冒泡的方法一次可以得到两个最值(最大者和最小者) , 从而使排序趟数几乎减少了一半。
void BubbleSort_Modify(int a[],int num)//冒泡排序算法 { int low=0; int high=num-1; while(low<high) { for(int i=low;i<high;i++)// 正向冒泡得到最大值 if(a[i]>a[i+1]) swap(a[i],a[i+1]); high--;//high前移一位 for(int i=high;i>low;i--)// 反向冒泡得到最小值 { if(a[i]<a[i-1]) swap(a[i],a[i-1]); } low++;//low后移一位 } }
以上是关于八大排序算法之五--交换排序—冒泡排序(Bubble Sort)的主要内容,如果未能解决你的问题,请参考以下文章