[数据结构与算法] 算法分析-冒泡排序法

问题:给定n个整数,将他们按(严格或非严格)升/降序排列。如:将 5、4、6、2、3、7、1 按升序排列

观察有序/无序序列中,任意/总有一对相邻元素顺序/逆序

扫描交换:依次比较每一对相邻元素,如有必要则交换之;
1)若整趟扫描都没有进行交换,则排序完成;
2)否则,再做一次扫描交换

从第一个元素开始,依次与右边相邻的元素做比较。如果第一个元素比第二个元素大则二者交换位置,否则不做操作。然后再比较第二和第三个元素,规则相同。直到最后一个元素也参与了比较,则第一轮循环结束。第一轮一共经过了n-1次比较,最大的元素必然被交换到队列的末尾。然后开始第二轮比较,同样从第一个元素开始,依次向右比较,将第二大的元素交换到队列倒数第二的位置,第二轮的比较次数为n-2。然后继续开始循环,直到所有的元素顺序排列。每一轮循环能够完成一个元素的落位,易知完成所有元素的排列需要 n-1轮循环,第 i 轮需要比较 n-i 次。

void bubblesort(int A[],int n){ //之后会进一步改进
    for(bool sorted = false; sorted = !sorted; n++)//逐趟扫描交换,直至完全有序
        for(int i = 1; i <n ; i++)//自左向右,逐对检查A[0,n)内各相邻元素
            if(A[i-1] > A[i]){    //若逆序,则
                swap(A[i-1], A[i]);//令其交换,同时
                sorted = false;//清除(全局)有序标志   
            }         
}

这种写法是效率比较低的。因为即使有时候我们经过两轮交换就以及完成了排序,但还是要根据循环变量继续循环下去。后面我们会对算法进行优化。

下面证明冒泡法的正确性

1)算法具有的不变性:经过k轮循环后,最大的k个元素必然就位。
2)算法的单调性:经过k轮循环后,问题的规模缩减至n-k
在这里插入图片描述
由以上两条,可以得出算法的正确性:至多经过n轮循环后,算法必然终止,并且给出正确结果。

接下来计算其复杂度
时间复杂度:1+2+ … + n-1 =n(n-1)/2= O( n^2)

封底估算
除了使用大O记号对算法进行定性分析,有时候还需要对算法进行粗略的定量分析,这时可以使用封底估算。下面列出一些我们常见的一些时间概念:

普通的pc机浮点计算速度大概为:10^9次/sec

1天=24h x 60min x 60sec ≈ 25 x 4000 = 10^5 sec

1生 ≈ 1世纪 =100年 x 365 = 3 x 10^4天 = 3 x 10^9 sec

“三生三世” ≈ 300年 = 10^10 sec

宇宙大爆炸至今 ≈ 10^21 sec

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值