排序算法--冒泡排序
冒泡:核心是相邻的两个数进行比较。然后量两两交换。知道没有交换,代表排序完成。这个算法的名字由来是因为越大的元素会经由交换慢慢“浮”到数列的顶端(升序或降序排列),就如同碳酸饮料中二氧化碳的气泡最终会上浮到顶端一样,故名“冒泡排序”。
外循环控制着冒泡的轮数,内循环控制着每轮比较的个数
第一轮比较:(从小到大为例)
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.
Aimer,c'est partager