冒泡排序(Bubble Sort):首先将记录的第一个关键字和第二个的关键字比较,如果第一个比第二个大那么就交换第一个和第二个的位子,然后将第二个和第三个比较…以此类推知道将第n-1和第n个比较,那么这样一趟下来可以保证最大的一个记录“沉”到了最后面,这样在对第1到第n-1冒泡,一般第i趟冒泡到n-i+1,要循环n-1次。
比如说有记录:49 38 65 97 76 13 27
第一趟:
第一次比较结果:38 49 65 97 76 13 27 //将48和38比较,49比38大,交换位置
第二次比较结果:38 49 65 97 76 13 27 //将49和65比较,49比65小,位置不变
第三次比较结果:38 49 65 9776 13 27
第四次比较结果:38 49 65 76 9713 27
第五次比较结果:38 49 65 76 13 9727
第六次比较结果:38 49 65 76 13 27 97 //第一趟的结果,将最大97“沉”到了最后面
第二趟:
第一次比较结果:38 49 65 76 13 2797
第二次比较结果:38 49 65 76 13 27 97
第三次比较结果:38 49 65 76 13 2797
第四次比较结果:38 49 65 13 76 27 97
第五次比较结果:38 49 65 13 27 7697 //第二趟比较过程中,只需要比较到倒数第二的位置,因为最后一个数一定是最大的,第二趟的结果,将倒数第二大的76“沉”到的后面
第三趟:
第一次比较结果:38 49 65 13 27 76 97
第二次比较结果:38 49 65 13 27 76 97
第三次比较结果:38 49 13 65 27 76 97
第四次比较结果:38 49 13 27 6576 97
第四趟:
……
第五趟:
……
第六趟
……
注意:在比较过程中如果某一趟没有发生位置交换,那么说明已经排好序,没有必要在进行下去
冒泡排序的时间复杂度为:O(n^2)
C++代码:
void myBubbleSort ( int * arr , int len )
{
bool isChange = true ; //用来记录某一趟中是否发生了交换
for ( int i = 0; i < len - 1; i ++) //控制
{
if (!isChange ) //如果没有交换说明已经排序好了
break ;
isChange = false ;
for ( int j = 0; j < len -i - 1; j ++)
{
if (arr [j ] > arr [j + 1] )
{
isChange = true ;
int temp = arr [j ];
arr [j ] = arr [j + 1] ;
arr [j + 1] = temp ;
}
}
}
}