冒泡排序是很经典的排序算法,记得大一的时候我去参加我们学校的linux兴趣小组,那个时候简直太菜了,人家让我写,我写了半天写不出来,真是o(╯□╰)o
我觉得要掌握冒泡排序及其算法,需要记住两点:
1、 外层循环用来控制比较次数,如n个数,则需要比较n-1
2、 内层循环用来控制相邻两数的比较
void Bubble_sort(int a[], int n)
{
int i, j, temp;
for(i = 0; i < n-1; i++)//记住这个n-1次的比较
for(j = 0; j < n-i-1; j++)//注意每一次都少了一个数,它“冒泡”了
if(a[j] > a[j+1])
{
temp = a[j];
a[j] = a[j+1];
a[j+1] = temp;
}
}
这段代码当然还有改进的地方,如果需要比较的数为{2,3,1,4,5,6,7,8,9,10…….n-1,n}
从第四个数开始到末尾都是有序的怎么办呢?很明显这个版本的不够精炼了
那我们怎么办呢?我们加一个标志位flag(这种思想很有用,不光是在冒泡排序这一种排序算法),内层循环开始时,即每一趟比较的开始,我们假设都是有序的,flag为true,在比较的过程中,一旦发现无序了,需要交换了,我们就把flag改为false。
代码如下:
void Bubble_sort(int a[], int n)
{
int i, j, temp;
bool flag = false;
for(i = 0; i < n-1 &&!flag; i++)//记住这个n-1次的比较
{
flag = true;//每趟开始时假设是有序的
for(j = 0; j < n-i-1; j++)//注意每一次都少了一个数,它“冒泡”了
if(a[j] > a[j+1])
{
temp = a[j];
a[j] = a[j+1];
a[j+1] = temp;
if(flag)
flag = false;//发生了交换,设为无序
}
}
}
冒泡排序是稳定的排序,平均和最坏时间复杂度是O(n^2)
最好时间复杂度为O(n),全部有序的情况