冒泡排序(Bubble Sort)是一种交换排序,它的基本思想是:两两比较相邻记录的关键字,如果反序则交换,直到没有反序的记录为止。
最简单的交换
//初级版,并非符合冒泡排序的思想
//(java)
void BubbleSort(List<int> list)
{
int i,j;
for(i = 1; i < list.size(); i++)
{
for(j = i+1; j< list.size(); j++)
{
//比较
if( list.get(i) > list.get(j) )
swap(list,i,j);
}
}
}
这段代码严格意义上说并不符合冒泡排序的思想,因为不满足“两两比较相邻记录”。相率比较低。
冒泡排序基本实现
void BubbleSort(list<int> list)
{
int i,j;
for(i = 1; i < list.size(); i++)
{
for(j = list.size()-1 ; j>=i; j--)
{
//比较
if( list.get(j) > list.get(j + 1) )
swap(list,j,j+1);
}
}
}
稳定排序:在每次循环中,并没有改变任意两个元素的次序,是稳定的。
冒泡排序的优化
如果要排序的序列是 {2,1,3,4,5,6,7,8,9},除了第一和第二个数据交换之后就已经是排序好了,但是程序还是不依不饶的遍历所有数据,后面的这些遍历和比较都是不必要的。
//增加标记变量flag来实现
void BubbleSort(list<int> list)
{
int i,j;
boolean flag = true;
for(i = 1; i < list.size() && flag; i++)
{
//初始化flag,表示是否已经确定有序了
flag = false;
for(j = list.size()-1 ; j>=i; j--)
{
//比较
if( list.get(j) > list.get(j + 1) )
{
swap(list,j,j+1);
//如果有数据交换则置为true
//说明还不确定已经是有序的
flay = true;
}
}
}
}
冒泡排序复杂度分析
最好的情况是排序之前已经是 有序的,只需要 n -1 次比较,没有数据交换,时间复杂度为O(n)
最坏的情况是排序前是逆序,需要比较 1+2+3+……+(n -1)= n(n-1)/2,时间复杂度为O(
n
2
n^2
n2)