冒泡排序
要排序的数组
| 索引: | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
|---|---|---|---|---|---|---|---|---|---|
| 数据: | 3 | 2 | 4 | 8 | 7 | 1 | 9 | 6 | 5 |
步骤:

3和2进行比较,大的右移,小的左移

8和7比,大的右移,小的左移

8和1比,大的右移,小的左移

9和6比,大的右移,小的左移

9和5比,大的右移,小的左移

ps:此时数组中最大的数已经移至最右方(剩下要比较的数组成新数组,长度为8) 7和1比,大的右移,小的左移

8和6比,大的右移,小的左移

8和5比,大的右移,小的左移

ps:此时数组中最大的数已经移至最右方(剩下要比较的数组成新数组,长度为7) 4和1比,大的右移,小的左移

4和7比,7和6比,大的右移,小的左移

7和5比,大的右移,小的左移

ps:此时数组中最大的数已经移至最右方(剩下要比较的数组成新数组,长度为6) 3和1比,大的右移,小的左移

6和5比,大的右移,小的左移

ps:此时数组中最大的数已经移至最右方(剩下要比较的数组成新数组,长度为5) 2和1比,大的右移,小的左移

从左至右,挨个比较,显示出的都是大的在右,小的在左,不用再比了

此时已全部排列完毕
代码演示:
//先定义一个数组
int[] arr = {3,2,4,8,7,1,9,6,5};
//先做一个错误的演示
//遍历数组
for(int i=0;i<arr.length;i++){
//变量i就是数组arr中的索引值
//拿到索引值i后,我们就可以对数组中的数据两两进行相比
//如果左边的数据值>右边的数据值,那就将这两个数据的位置进行就交换(也就是索引值的交换)
if(arr[i] > arr[i+1]){
//把大值赋给temp变量
int temp = arr[i];
//把小值赋给arr[i]
arr[i] = arr[i+1];
//把temp中存的大值赋给arr[i+1]
arr[i+1] = temp;
}
}
/*
上面的代码运行后会出现一个错误:
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 9
为什么会出现 数组越界异常:9呢?
首先,我们知道上面的代码中,数组的长度是9,但是最大索引值是8
for(int i=0;i<arr.length;i++)这行代码,表示的是取出数组的每一个索引,也就是0-8
if(arr[i] > arr[i+1])当取出的索引值i为8时,arr[i+1]实际上是arr[8+1],很明显数组arr中没有索引值为9,最大索引值就是8,所以代码走完这一行后,jvm虚拟机就会抛出一个数组越界的异常
-------------------------------------------------------------------------------------
那我们该怎么修改呢?
通过上面的代码我们可以知道,进入for循环进行比较的时候,i的值是需要的+1的,所以我们的解决办法就是在for循环中的条件判断出,将i<arr.length改为i<arr.length-1,这样就可以避免数组越界的异常了
*/
=====================================================================================
/*
正确代码演示:
上面的代码,只是对数组中相邻的两个数据一次的比较,只有进行多次比较才能完成全部的排序,那如何完成全部的比较呢?
思路:
1.通过上面的步骤图我们发现,当代码走完一次for循环,我们打印数组会发现:数组中最大值已经被排序到了最右侧
2.当数组中最大值被排序到了最右侧时,我们需要再排序的数据的数量:就是原数组的长度-1
*/
//先定义一个数组
int[] arr = {3,2,4,8,7,1,9,6,5};
//写一个for循环
//for内部的第一个参数表示循环的初始值(我们设为数组的长度)
//第二个参数是循环的条件(我们设为长度大于0,因为数组的长度不可能等于0)
//第三个参数是每次循环后要改变的操作(我们设为,让长度减1)
//外层for循环的意义是:每次循环,拿到k的值(也就是数组长度)
for(int k = arr.length;k>0;k--){
//内层for循环的意义:每次循环拿到数组的索引值,通过索引获取对应的数据进行比较
for(int i=0;i<k-1;i++){
if(arr[i] > arr[i+1]){
int temp = arr[i];
arr[i] = arr[i+1];
arr[i+1] = temp;
}
}
}
/*
解释:
内层for循环走完一次,表示arr[i]和arr[i+1]中的最大值已经排序到了最右侧
外层for循环走完一次,表示整个数组中的最大值已经排序到了最有侧
*/