排序算法--冒泡排序

冒泡:核心是相邻的两个数进行比较。然后量两两交换。知道没有交换,代表排序完成。这个算法的名字由来是因为越大的元素会经由交换慢慢“浮”到数列的顶端(升序或降序排列),就如同碳酸饮料中二氧化碳的气泡最终会上浮到顶端一样,故名“冒泡排序”。

外循环控制着冒泡的轮数,内循环控制着每轮比较的个数

第一轮比较:(从小到大为例)

a[0] 和 a[1] 进行比较,若a[0] > a[1],则两两交换,再将a[1] 同 a[2] 进行比较,若a[1] > a[2] 则两两交换......同理,一直比较到a[n-2] 和 a[n-1],最终,最大的数会冒泡在数列的顶端。

第二轮比较:

a[0] 和 a[1] 进行比较,若a[0] > a[1],则两两交换,再将a[1] 同 a[2] 进行比较,若a[1] > a[2] 则两两交换......同理,一直比较到a[n-3] 和 a[n-2],最终,第二大的数也找出并且放在新的队列里面。

.

.

.

第n-1轮比较进行比较,比较a[0] 和 a[1],实际上在上一轮最后两个数已经比较过了。

改进版:

假设数组如下:

int[] a = { 999, 1, 2, 3, 4, 5, 7, 12, 14, 16, 78 };

在第一轮排序之后,999 已经被放置在数列的定端,也就意味着排序已经完成,但是按照上面的冒泡算法,实际上还是进行了多轮的遍历判断。

因此,我们需要加上一个判断条件,当元素不再满足两两交换的条件的时候,意味排序完成,终止遍历。代码如下:

在外循环里面定义一flag = false,每次两两交换之后变更为true,当不再有两两交换的时候,遍历就会break.

原文地址:https://www.cnblogs.com/pickKnow/p/9541659.html