冒泡排序较为简单,思路如下:
建立两个相邻的索引,比较两个索引所代表的数的大小并交换位置,两个索引每次同时向右移动一格,一次循环过后,就能在最右端找到最大的数或者最小的数,然后对剩下的数进行相同操作,找出最大值,这样一来,在最差情况下,需要(n-1)!次比较即可完成排序,流程大致如下图
image.pngimage.pngimage.png
代码如下
通过 j 控制索引的移动,外层的循环则是代表了最多进行n-1次排序才能成功
**public static void **bubbleSort(**int**[] arr){<br /> **int **temp = 0; _//中间转换变量<br /> //boolean flag = false;<br /> _**for **(**int **i = 0;i<arr.**length**-1;i++){<br /> **boolean **flag = **false**;_//标识变量,表示是否进行过交换,如果没有,则直接返回<br /> _**for**(**int **j = 0;j<arr.**length**-1-i;j++){<br /> **if**(arr[j]>arr[j+1]){<br /> flag = **true**;<br /> temp = arr[j];<br /> arr[j] = arr[j+1];<br /> arr[j+1] = temp;<br /> }<br /> }<br /> **if **(!flag){<br /> **break**;<br /> }<br /> }<br />}
这里加入了一点优化,即如果一次循环下来都没有发生数字交换,则说明该数组已经排序完成,无需进行接下来的排序。

小结

冒泡排序的平均时间复杂度是O(n2),最好情况下只需要