冒泡排序详细过程,c语言实现

冒泡排序和快速排序都是交换排序,交换排序是内部排序。

过程:比较相邻的元素,根据要求判断是否需要交换他们的位置,直到排序结束。

例如给出:1   3   5   4   2

从后往前比较:

第一趟:

开始    2与4比较:2小,所以交换位置后:1   3   5   2   4 

然后    2与5比较:5大,所以交换位置后:1   3   2   5   4

然后    2与3比较:3大,所以交换位置后:1   2   3   5   4 

然后    2与1比较:2大,所以不交换位置:1   2   3   5   4

第一趟结束后:1   2   3   5   4  共比较了4次,交换了3次

此时第一趟排序结束,我们能确定的是  第一个元素一定是最小的元素1,所以第二趟排序只需要比较到1后一个元素。


第二趟:

开始    4与5比较:5大,所以交换位置后:1   2   3   4   5   

然后    4与3比较:3小,所以不交换位置:1   2   3   4   5  

然后    2与3比较:2小,所以不交换位置:1   2   3   4   5   

然后    因为已知1是最小的元素,所以2无需再比较,比较第二趟比较结束

第二趟结束后,可知第二趟比较了3次,交换了1次

此时第二趟排序结束,我们能确定的是  第二个元素一定是第二小的元素2,所以第三趟排序只需要比较到2后一个元素。


第三趟

开始    5与4比较:4小,所以不交换位置:1   2   3   4   5

然后    4与3比较:3小,所以不交换位置:1   2   3   4   5

此时第三趟结束,可知比较了两次,并没有交换

此时按道理应该开始第四趟比较,也就是比较4和5,但是我们通过第三趟比较后可以知道,顺序已经排好了,所以再次比较,只会增加算法的时间,降低算法的性能,所以我们应该设置一个标记变量flag,当比较没有交换后,我们可以跳出循环,打印结果。

上述比较的详细过程与结果



在实际写的过程中,我们无需知道详细步骤,只要结果就行,算法如下




接着讨论算法的时间复杂度

当本身就是正序的时候,只需要比较(n-1)次就行,时间复杂度为O(n)


当完全逆序的时候,就是最坏的情况,此时需要比较(1+2+3+......+(n-1))

=n*(n-1)/2次,并且做同等数量级的交换次数,

所以总的时间复杂度为O(n^2)






猜你喜欢

转载自blog.csdn.net/weixin_40100502/article/details/80547985