冒泡排序是一种交换排序方法,每次排序之后都会使最大值“沉底”,小值上升,因此成为冒泡排序。时间复杂度 : O(n^2),空间复杂度 : O(1)。
直接看代码:
#include<iostream>
using namespace std;
void printarr(int arr[],int n);
void bubbleSort(int arr[],int n)
{
int i,temp;
for(i=0;i<n;i++)
{
for(int j=1;j<n-i;j++)
{
if(arr[j-1]>arr[j])
{
//swap(arr[j-1],arr[j]);
temp=arr[j-1];
arr[j-1]=arr[j];
arr[j]=temp;
}
}
cout<<"第"<<i<<"次排序结果"<<endl;
printarr(arr,n);
cout<<endl;
}
}
void printarr(int arr[],int n)
{
for(int m=0;m<n;m++)
{
cout<<arr[m]<<" ";
}
}
void main()
{
int array[]={3,8,5,9,7,6,2,1,10,4};
bubbleSort(array,10);
}
上述代码运行结果是:
以上代码比较了10次,即使在第7次时我们已经排序完成,后面的比较依然进行;
如果用一个标志位flag来表示该次排序是否进行交换,我们可以预先知道排序是否完成,可提高排序算法效率;把bubbleSort函数改成以下形式:
void bubbleSort(int arr[],int n)
{
int j,flag=1;
int x,k=n-1;
while((k>0)&&(flag==1))
{
flag=0;
//for(j=0;j<k;j++)
// if(arr[j]>arr[j+1])
// {
// flag=1;
// x=arr[j];
// arr[j]=arr[j+1];
// arr[j+1]=x;
// }
for(j=1;j<=k;j++)
if(arr[j-1]>arr[j])
{
flag=1;
x=arr[j];
arr[j]=arr[j-1];
arr[j-1]=x;
}
cout<<"第"<<n-k<<"次排序结果"<<endl;
printarr(arr,n);
cout<<endl;
k--;
}
}
由运行结果可知,通过加入标志位,可以在排序完成时提前结束排序算法,减少了比较次数。