我认为冒泡排序法的重点就在于:
1.理解两个for循环代表什么
2.理解每轮冒泡可以确保最大的数字被移动到未排序序列(也就是下图蓝色圈圈)的最后位置。
理论知识:
在这张图片中一列有7个数字,如果想要从让大的排在上面,小的数字排在下面需要5轮。
- 先观察第0轮:5比2大,就与2交换;5和7比较,不交换;7和6比较,交换;7和1比较,交换。。。。直到比到最上面的数字。通过一轮的比较就能找到整串数字中最大的那个数字 7,如第一轮所示。
- 第二轮依旧是两两相比,大的数字就通过交换放到最上面,通过第二轮我们获得了这串数字中第二大的数字6,因为最大的数字7第一轮已经找到了,所以6和7就不需要再比较了,节约了运行时间和空间
- 第三轮比完后会获得这串数字中第三大的数字5,同样的5不用继续和上面的数字作比较了。因为比5大的早已经像泡泡一样浮在上面了。
- 经过5轮之后就能把数字完整的排列下来了;那为什么是五轮呢?因为在第五轮的时候末尾两个数字已经比过一次了,不需要再重新比一轮了,所以比几轮就等于数字数量-2,假如八个数字只需要比六轮。。。。以此类推
代码实现:
- 第一个for代表的是循环多少轮
- 第二个for代表的是每轮数组比较的次数,j < arr.length - i - 1这个条件是因为只要是每轮已经排好的最大的数字不需要再排了。
- if条件用来交换,从而使大的数字往上浮。
public static void main(String[] args) {
int[] arr = {5, 2, 7, 6, 1, 4, 3};
for (int i = 0; i < arr.length - 1; 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));
}