冒泡排序
原理:比较两个相邻元素,大的放在后,第一次完毕后,最大值在数组的最后
先看一下图示,然后在解释:
第一次冒泡排序时:先比较20跟60,大的放后面,所以位置不变,再比较60跟80,一样不变,再比较80跟50,80较大,交换80跟50的位置,在拿交换后的80跟10比较,80同样较大,跟10交换位置。这样,第一次冒泡排序就结束了,看图可知,数组元素最大的80已经在最后面了
第二次冒泡排序时:拿第一次冒泡排序后的位置比较,先比较20跟60,位置不变,再比较60跟50,60大,交换位置,再比较60个10,交换位置,最后,60跟80就不用再继续比较了,因为前一次比较已经得到80是最大的了。这样,第二次冒泡排序就结束了,看图可知,数组元素第二大的已经在倒数第二个位置了
第三次冒泡排序时:拿第二次冒泡排序后的位置比较,先比较20跟50,位置不变,再比较50跟10,交换位置,后面就不用比较了。这样,第三次冒泡排序也结束了,看图可知,数组元素第三大的已经在第三个位置了
第四次冒泡排序:拿第三次冒泡排序后的位置比较,这时只需比较第一个和第二个元素大小即可,20比10大,交换位置。这样,由图可知,数组就已经按照从小到大的顺序排好了
总结分析:如果一个数组arr.length=5,也就是有5个元素,它就要经过(arr.length-1)次,也就是4次冒泡排序;第一次冒泡排序要比较(arr.length-1)次,第二次冒泡排序要比较(arr.length-2)次,第三次冒泡排序要比较(arr.length-3)次,第四次冒泡排序要比较(arr.length-4)次,这时,arr.length-4在这个数组中也就等于1,也就不用再比较了,因为就剩下自己,自己跟自己比没有意义
代码实现:
package org.westos.demo2;
import java.util.Arrays;
public class Test {
public static void main(String[] args) {
int[] arr = {20, 60, 80, 50, 10};
//第一次排序
for (int i = 0; i < arr.length-1; i++) {
//判断相邻元素大小,如果前面的比后面的大,则交换位置
if(arr[i]>arr[i+1]){
int temp = arr[i];
arr[i] = arr[i+1];
arr[i+1] = temp;
}
}
//第二次排序
for (int i = 0; i < arr.length-1-1; i++) {
//判断相邻元素大小,如果前面的比后面的大,则交换位置
if(arr[i]>arr[i+1]){
int temp = arr[i];
arr[i] = arr[i+1];
arr[i+1] = temp;
}
}
//第三次排序
for (int i = 0; i < arr.length-1-1-1; i++) {
//判断相邻元素大小,如果前面的比后面的大,则交换位置
if(arr[i]>arr[i+1]){
int temp = arr[i];
arr[i] = arr[i+1];
arr[i+1] = temp;
}
}
//第四次排序
for (int i = 0; i < arr.length-1-1-1-1; i++) {
//判断相邻元素大小,如果前面的比后面的大,则交换位置
if(arr[i]>arr[i+1]){
int temp = arr[i];
arr[i] = arr[i+1];
arr[i+1] = temp;
}
}
System.out.println(Arrays.toString(arr));
}
}
运行结果:
第一次写,我们可以把每一次的排序过程写出来,由这四次可以看出,冒泡排序唯一的不同就是在执行判断语句的时候i<arr.length-1会随着次数的增加而减少,因为你在第二次排序的时候最后一个元素是不用跟前面的在比了,同理在第三次排序的时候最后两个元素也不用跟前面的比
可得出这样的结论:排序次数每增加一次,判断语句就多减1,那么我们可以再外面再套一个循环,达到操作判断语句的效果,这样,就不用一直写重复的代码
代码简化:
package org.westos.demo2;
package org.westos.demo2;
import java.util.Arrays;
class Demo {
public static void main(String[] args) {
int[] arr = {20, 60, 80, 50, 10};
for (int j = 0; j < arr.length-1; j++) {//外层循环控制排序次数
for (int i = 0; i < arr.length - 1 - j; i++) {
//判断相邻元素大小,如果前面的比后面的大,则交换位置
if (arr[i] > arr[i + 1]) {
int temp = arr[i];
arr[i] = arr[i + 1];
arr[i + 1] = temp;
}
}
}
System.out.println(Arrays.toString(arr));
}
}
看看运行结果是否正确:
就这道题而言,再写外循环的时候可以直接写j<4,但这并不妥当,如果数组改变一下,这个代码就会不适用,所以要改动一下,就是让j<arr.length-1,为什么这样写,从上面的总结分析可以看出。这样,不管是哪个数组,这个简化代码都适用