冒泡排序算法(BubbleSort)
冒泡排序以其“在排序过程中相邻元素不断交换,一些元素慢慢被换到最后,看起来就像是元素在冒泡一样”而得名,它是最简单的一种排序算法,通常被用来对于计算机程序设计入门算法讲解。
Definition
该算法的实现分以下几步:
- 每次从头开始依次比较相邻的两个元素
- 如果后面一个元素比前一个要小,说明顺序不对,则将它们交换
- 循环完毕之后再次从头开始扫描,直到某次扫描中没有元素交换,不断地重复以上两个过程,直到全部有序
例如有一需要排序的数组为:5,8,6,3,9,2,1,7(从小到大排序):
第一轮排序:
1、首先5和8进行交换,发现5比8小,略过。
2、8和6比较,发现8比6大,交换位置。
3、8和3比较,8比3要大,交换位置。
4、8和9比较,8比9小,略过
5、9和2比较,9比2大,进行交换
6、9和1进行比较,发现9比1大,交换位置。
7、最后,让9和7交换位置
这样一来,元素9作为数列的最大元素,就已经排序好了。
可以看到最大的数已经排序到最后,下次就可以不用遍历已经排序好的元素。
Implementation
// 普通冒泡算法
public static void bubbleSort(int[] arr){
int i,j,temp,len = arr.length;
for (i = 0; i < len -1; i++) {
for (j = 0; j < len - 1- i; j++) {
if(arr[j] > arr[j+1]){
temp = arr[j+1];
arr[j+1] = arr[j];
arr[j] = temp;
}
}
}
}
// 改进的冒泡算法,利用flag做标记。如果在本轮排序中,元素有交换,则说明数列无序,如果没有交换,则说明数列已然有序,直接返回。
public static void bubbleSort1(int[] arr){
boolean flag = true;
int temp,j = 0; //j的作用是不再遍历已经排序好的数
while(flag){
flag = false;
for (int i = 0; i< arr.length -1-j;i++){
if(arr[i] > arr[i+1]){
temp = arr[i+1];
arr[i+1] = arr[i];
arr[i] = temp;
flag = true;
}
}
j++;
}
}
测试:
public static void main(String[] args) {
int[] arr = new int[]{
1,2,5,6,4,2,3,1,7};
bubbleSort1(arr);
System.out.println(Arrays.toString(arr));
}
结果:
[1, 1, 2, 2, 3, 4, 5, 6, 7]
图来源:lu_1079776757(原谅我不会做图)