经典排序算法-冒泡排序

故事的程序员

冒泡排序的思想,我们要把相邻的元素两两比较,根据大小来交换元素的位置
示例图:
在这里插入图片描述

正常编码

public class BubbleSort {
    
    

	public static void main(String args[]) {
    
    

		int[] arr = {
    
     1, 5, 2, 67, 46, 24, 90, 33 };
		for (int i = 0; i < arr.length; i++) {
    
    
			for (int j = 0; j < arr.length - i - 1; j++) {
    
    

				if (arr[j] > arr[j + 1]) {
    
    
					int temp = arr[j];
					arr[j] = arr[j + 1];
					arr[j + 1] = temp;
				}
			}
		}
		System.out.println(Arrays.toString(arr));
	}

}

结果:

排序次数如下:
0:[1, 5, 2, 67, 46, 24, 90, 33]
0:[1, 2, 5, 67, 46, 24, 90, 33]
0:[1, 2, 5, 67, 46, 24, 90, 33]
0:[1, 2, 5, 46, 67, 24, 90, 33]
0:[1, 2, 5, 46, 24, 67, 90, 33]
0:[1, 2, 5, 46, 24, 67, 90, 33]
0:[1, 2, 5, 46, 24, 67, 33, 90]
1:[1, 2, 5, 46, 24, 67, 33, 90]
1:[1, 2, 5, 46, 24, 67, 33, 90]
1:[1, 2, 5, 46, 24, 67, 33, 90]
1:[1, 2, 5, 24, 46, 67, 33, 90]
1:[1, 2, 5, 24, 46, 67, 33, 90]
1:[1, 2, 5, 24, 46, 33, 67, 90]
2:[1, 2, 5, 24, 46, 33, 67, 90]
2:[1, 2, 5, 24, 46, 33, 67, 90]
2:[1, 2, 5, 24, 46, 33, 67, 90]
2:[1, 2, 5, 24, 46, 33, 67, 90]
2:[1, 2, 5, 24, 33, 46, 67, 90]
3:[1, 2, 5, 24, 33, 46, 67, 90]
3:[1, 2, 5, 24, 33, 46, 67, 90]
3:[1, 2, 5, 24, 33, 46, 67, 90]
3:[1, 2, 5, 24, 33, 46, 67, 90]
4:[1, 2, 5, 24, 33, 46, 67, 90]
4:[1, 2, 5, 24, 33, 46, 67, 90]
4:[1, 2, 5, 24, 33, 46, 67, 90]
5:[1, 2, 5, 24, 33, 46, 67, 90]
5:[1, 2, 5, 24, 33, 46, 67, 90]
6:[1, 2, 5, 24, 33, 46, 67, 90]
[1, 2, 5, 24, 33, 46, 67, 90]

优化一

public class BubbleSort {
    
    

	public static void main(String args[]) {
    
    
		int num = 0;
		int[] arr = {
    
     1, 5, 2, 67, 46, 24, 90, 33 };
		for (int i = 0; i < arr.length; i++) {
    
    
			boolean sorted = true;// 有序标记,每一轮的初始是true
			num = i;
			for (int j = 0; j < arr.length - i - 1; j++) {
    
    
				if (arr[j] > arr[j + 1]) {
    
    
					int temp = arr[j];
					arr[j] = arr[j + 1];
					arr[j + 1] = temp;
					sorted = false; // 有元素交换,所以不是有序,标记变为false
				}
				System.out.println(num + ":" + Arrays.toString(arr));
			}
			if (sorted) {
    
    
				break;
			}

		}

	}

}

结果:

排序次数
0:[1, 5, 2, 67, 46, 24, 90, 33]
0:[1, 2, 5, 67, 46, 24, 90, 33]
0:[1, 2, 5, 67, 46, 24, 90, 33]
0:[1, 2, 5, 46, 67, 24, 90, 33]
0:[1, 2, 5, 46, 24, 67, 90, 33]
0:[1, 2, 5, 46, 24, 67, 90, 33]
0:[1, 2, 5, 46, 24, 67, 33, 90]
1:[1, 2, 5, 46, 24, 67, 33, 90]
1:[1, 2, 5, 46, 24, 67, 33, 90]
1:[1, 2, 5, 46, 24, 67, 33, 90]
1:[1, 2, 5, 24, 46, 67, 33, 90]
1:[1, 2, 5, 24, 46, 67, 33, 90]
1:[1, 2, 5, 24, 46, 33, 67, 90]
2:[1, 2, 5, 24, 46, 33, 67, 90]
2:[1, 2, 5, 24, 46, 33, 67, 90]
2:[1, 2, 5, 24, 46, 33, 67, 90]
2:[1, 2, 5, 24, 46, 33, 67, 90]
2:[1, 2, 5, 24, 33, 46, 67, 90]
3:[1, 2, 5, 24, 33, 46, 67, 90]
3:[1, 2, 5, 24, 33, 46, 67, 90]
3:[1, 2, 5, 24, 33, 46, 67, 90]
3:[1, 2, 5, 24, 33, 46, 67, 90]

优化二

public class BubbleSort {
    
    

	public static void main(String args[]) {
    
    
		int num = 0;
		int[] arr = {
    
     1, 5, 2, 67, 46, 24, 90, 33 };
		int lastExchangeIndex = 0;// 最后一次比较交换的位置
		int sortBorder = arr.length - 1;// 无序数列的边界,每次比到这里就行
		for (int i = 0; i < arr.length; i++) {
    
    
			boolean sorted = true;// 有序标记,每一轮的初始是true
			num = i;
			for (int j = 0; j < sortBorder; j++) {
    
    
				if (arr[j] > arr[j + 1]) {
    
    
					int temp = arr[j];
					arr[j] = arr[j + 1];
					arr[j + 1] = temp;
					sorted = false; // 有元素交换,所以不是有序,标记变为false
					lastExchangeIndex = j; // 把无序数列的边界更新为最后一次交换元素的位置
				}
				System.out.println(num + ":" + Arrays.toString(arr));
			}
			sortBorder = lastExchangeIndex;
			if (sorted) {
    
    
				break;
			}

		}

	}

}

结果:

排序次数:
0:[1, 5, 2, 67, 46, 24, 90, 33]
0:[1, 2, 5, 67, 46, 24, 90, 33]
0:[1, 2, 5, 67, 46, 24, 90, 33]
0:[1, 2, 5, 46, 67, 24, 90, 33]
0:[1, 2, 5, 46, 24, 67, 90, 33]
0:[1, 2, 5, 46, 24, 67, 90, 33]
0:[1, 2, 5, 46, 24, 67, 33, 90]
1:[1, 2, 5, 46, 24, 67, 33, 90]
1:[1, 2, 5, 46, 24, 67, 33, 90]
1:[1, 2, 5, 46, 24, 67, 33, 90]
1:[1, 2, 5, 24, 46, 67, 33, 90]
1:[1, 2, 5, 24, 46, 67, 33, 90]
1:[1, 2, 5, 24, 46, 33, 67, 90]
2:[1, 2, 5, 24, 46, 33, 67, 90]
2:[1, 2, 5, 24, 46, 33, 67, 90]
2:[1, 2, 5, 24, 46, 33, 67, 90]
2:[1, 2, 5, 24, 46, 33, 67, 90]
2:[1, 2, 5, 24, 33, 46, 67, 90]
3:[1, 2, 5, 24, 33, 46, 67, 90]
3:[1, 2, 5, 24, 33, 46, 67, 90]
3:[1, 2, 5, 24, 33, 46, 67, 90]
3:[1, 2, 5, 24, 33, 46, 67, 90]

故事的程序员 生命不息,撸码不止~

猜你喜欢

转载自blog.csdn.net/lchlaughing/article/details/103905115