冒泡排序

原创
2013/06/08 16:33
阅读数 259

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 稳定性:稳定

展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
打赏
0 评论
1 收藏
0
分享
返回顶部
顶部