1 排序思想:
依次比较相邻的两个元素,若逆序,则交换位置。直到没有反序的记录。
第1趟:依次比较并交换R1与R2、R2与R3、……、R(n-1)与R(n),这次排序之后,第n个记录就是最终记录;
第2趟:对前(n-1)个记录进行上述操作,则第(n-1)个记录就在其最终位置;
然后依次对前(n-2)、前(n-3)、……、前2个记录进行上述操作。共需(n-1)趟排序。
如果某一趟没有进行交换记录,则说明已经完成排序,应当停止排序。
冒泡排序每趟排序操作都可以将一个元素放到最终位置。
2 算法实现:
// 冒泡排序
void bubble_sort(int num[], int len){
int i,j,tmp;
bool flag;
// 共需进行len-1趟排序
for(j=0;j<len-1;j++){
flag=true;
// 每趟排序对前len-j个元素进行处理
for(i=0;i<len-j-1;i++){
if(num[i]>num[i+1]){
tmp=num[i];
num[i]=num[i+1];
num[i+1]=tmp;
flag=false;
}
}
// 如果flag等于true,表示这一趟没有进行交换
// 即前len-j个元素是有序的,可以停止比较
if(flag)
break;
}
}
3 性能分析:
3.1 空间复杂度:如上代码,使用了一个辅助单元tmp,空间复杂度为O(1)
3.2 时间复杂度:
3.2.1 最好情况:待排序记录已经是有序的,则只要进行一趟排序,关键字比较(n-1)次,记录移动0次。
时间复杂度O(n)
3.2.2 最坏情况:待排序记录已经是逆序的,则一趟排序,关键字比较次数(n-i-1)次,记录移动3(n-i-1)次。整个过程
比较次数为
记录移动次数为
时间复杂度O(n^2)
3.2.3 平均时间复杂度:O(n^2)
3.3 稳定性:稳定