基础算法系列(二)——冒泡排序

本文介绍冒泡排序的基本原理及其实现方法,通过示例代码详细解释了算法的工作流程,并分析了其时间复杂度和空间复杂度。此外还讨论了冒泡排序的重要特性,如稳定性及其在部分有序序列上的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

和选择排序同样,冒泡排序也是经典的排序算法,很多入门课程讲的第一个算法就是它。所谓冒泡,指排序过程中元素的移动方式就像上浮的气泡,非常形象。

算法思想:

1、从后向前遍历,把当前元素与其前驱元素排序,一轮后可以使最小(大)的元素移动到表头。

2、对于包含n个元素的表,重复上述过程n次即可达到有序。


示例代码:

#define  SWAP(A, B) do{(A) ^= (B); (B) ^= (A); (A) ^= (B);} while(0)

enum {FALSE, TRUE};

void _bubble_sort(int array[], int left, int right) {
    int i, j;
    int unshift;                            //判断遍历时是否有元素移位的标志位
    
    for(i = 0; i < right; i++) {
        unshift = TRUE;
        for(j = right; j > i; j--) {
            if(array[j - 1] > array[j]) {
            SWAP(array[j - 1], array[j]);
            unshift = FALSE;    
            }
        }
        if(unshift == TRUE) {         //若遍历一轮后没有发生移位说明已经达到有序
            break;
        }
    }
}

void bubble_sort(int array[], int len) {
    _bubble_sort(array, 0, len - 1);
}

复杂度分析:

内部循环执行了n-i次(i = 1, 2, 3,... , n - 1),外部循环执行了n次,总共进行了n*(n - 1)/2次比较,时间复杂度为O(n^2),在最坏情况下需要移动元素n*(n-1)/2次。另外,由于不需要额外空间,空间复杂度为O(1)。


重要性质:

1、若相邻元素相等则不会进行交换,故为稳定排序

2、可以通过一轮遍历中是否发生元素移位判断是否已经达到有序,在原始序列部分有序时可以提高效率



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值