1、最基本版本
冒泡排序是非常容易理解和实现,设数组长度为N,以从小到大排序举例:
1)比较相邻的前后2个数据,如果前面数据大于后面的数据,就将2个数据交换。
2)这样对数组的第0个数据到N-1个数据进行一次遍历后,最大的一个数据就“沉”到数组第N-1个位置(也可以是把最小的元素浮到最前面)。
3)N=N-1,如果N不为0就重复前面2步,否则排序完成。
代码见://冒泡排序版本1
2、改进版本一
下面对其进行优化:设置一个标志,如果这一趟发生了交换,则为true,否则为false。显然,如果有一趟没有发生交换,说明排序已经完成。!!!!
代码见://冒泡排序版本2
3、改进版本二
再做进一步的优化。如果有100个数的数组,仅前面10个无序,后面90个都已排好序且都大于前面10个数字,那么在第一趟遍历后,最后发生交换的位置必定小于10,且这个位置之后的数据必定已经有序了,记录下这位置,第二次只要从数组头部遍历到这个位置就可以了。!!!!
代码见://冒泡排序版本3
4、代码
第一种是O(n^2)。第二种和第三种,最好的情况,如所有的数据都已排好序,都是O(n),最坏的情况,如完全的逆序排列,都是O(n^2)。
#include <iostream>
using namespace std;
void print(int a[], int n)
{
for(int i=0;i<n;i++)
cout<<a[i]<<" ";
cout<<endl;
}
//冒泡排序版本1
void BubbleSort1(int a[], int n)
{
for(int i=0;i<n-1;i++)
{//只需n-1趟排序
//(1)从前向后排序,每一趟排序把最大的元素沉到最后面!!!
//for(int j=1;j<n-i;j++)
//(2)从后向前排序,每一趟排序把最小的元素浮到最前面!!!
for(int j=n-1;j>i;j--)
{//替换为(1)的for(int j=1;j<n-i;j++)也可
if(a[j] < a[j-1]) swap(a[j],a[j-1]);
}
}
}
//冒泡排序版本2
void BubbleSort2(int a[], int n)
{
bool flag=true;
int k=n;
while(flag)
{//当某一趟有交换时才进行排序,否则排序完成
flag=false;
for(int j=1;j<k;j++)
{//一趟排序
if(a[j] < a[j-1])
{
swap(a[j], a[j-1]);
flag=true;
}
}
k--;
}
}
//冒泡排序版本3
void BubbleSort3(int a[], int n)
{
int flag=n;
int k;
while(flag>0)
{
k=flag;
flag=0;
for(int j=1;j<k;j++)
{//一趟排序
if(a[j] < a[j-1])
{
swap(a[j], a[j-1]);
flag=j;//记录下最后交换的位置
}
}
}
}
int main()
{
int a1[]={6,2,8,3,5,5,20,32,1};
int a2[]={2,8,5,5,20,32,1,19,2};
int a3[]={17,5,8,3,88,5,20,32,3};
int n1=sizeof(a1)/sizeof(a1[0]);
int n2=sizeof(a2)/sizeof(a2[0]);
int n3=sizeof(a3)/sizeof(a3[0]);
BubbleSort1(a1, n1);
print(a1, n1);
BubbleSort2(a2, n2);
print(a2, n2);
BubbleSort3(a3, n3);
print(a3, n3);
return 0;
}
结果:
1 2 3 5 5 6 8 20 32
1 2 2 5 5 8 19 20 32
3 3 5 5 8 17 20 32 88
Process returned 0 (0x0) execution time : 0.474 s
Press any key to continue.