首先我们先了解一下什么是冒泡排序
冒泡排序:就是给定一个数组,然后依次从左到右相邻的两个数两两比较,如果是升序排列,如果前面一个数大于后面一个数就交换位置,直到遍历到最后一个,然后进行第二轮的比较,第二轮的比较仍然从第一数开始,进行两两比较,然后进行第三轮,依次类推
下面我们举例来具体阐述一下:
给定一个数组,进行排序:2,6,1,3,8,5从小到大的顺序排列
第一轮:遍历整个数组,相邻两个两两比较,如果前面大于后面,就交换
2,6,1,3,8,5—>2,1,6,3,8,5—》2,1,3,6,8,5—》2,1,3,6,8,5—-》2,1,3,6,5,8
那么第一轮比较就结束了最后的结果:2,1,3,6,5,8
那么我们用代码实现这个过程
在这个之前我们先了解一下Java中数组类型的变量的声明和赋值以及遍历打印
//先定义一个数组,由于数组是对象,所以定义的时候应该new一下
//在定义数组的同时进行快速赋值
int[] num = new int[]{2,6,1,3,8,5};
System.out.println(num);//这里打印只是一个数组的引用的地址
//遍历的方法打印数组
for(int i=0;i<num.length;i++){
System.out.print(num[i]+",");
}
System.out.println("
");
//foreach的方法快速打印和遍历数组
//这里的i表示的数组的每一个元素的值,而不是下标
for(int i:num){
System.out.print(i+",");
}
System.out.println("
");
//字符数组的声明和遍历打印
String[] str= new String[]{"hello","world"};
for(String i:str){
System.out.println(i+",");
}
下面我们实现第一轮
//定义一个数组并进行快速赋值
int[] num = new int[]{2,6,1,3,8,5};
//升序排列
//两两比较
int temp;
for(int i=0;i<num.length-1;i++){
//一定要注意我们后面比较的是i和i+1
//所以这里的i的终止条件为num.length-1
//防止溢出
if(num[i]>num[i+1]){
temp=num[i];
num[i]=num[i+1];
num[i+1]=temp;
}
}
for(int i:num){
System.out.print(i+" ");
}
---》2 1 3 6 5 8
//定义一个数组并进行快速赋值
int[] num = new int[]{6,5,4,3,2,1};
for(int i:num){
System.out.print(i+" ");
}
System.out.println("
");
//升序排列
//两两比较
int temp;
int count=0;
for(int j=0;j<num.length-1;j++){
//如果将每次循环的结果打印出来我们可以看到
//事实上外层循环只需要num.length-1次就行了
for(int i=0;i<num.length-j-1;i++){
//这里第一轮将最大值移动到了最后,
//所以第二轮只需要比较前面五个数就行了
//所以内层循环就是num.length-1
//一定要注意我们后面比较的是i和i+1
//所以这里的i的终止条件为num.length-1
//防止溢出
if(num[i]>num[i+1]){
temp=num[i];
num[i]=num[i+1];
num[i+1]=temp;
}
}
count++;
System.out.print("第"+count+"次:");
for(int i:num){
System.out.print(i+" ");
}
System.out.println("
");
}
这里我们利用最坏的结果来举例 6 5 4 3 2 1 ,将它从小到大的顺序排列
第1次:5 4 3 2 1 6
第2次:4 3 2 1 5 6
第3次:3 2 1 4 5 6
第4次:2 1 3 4 5 6
第5次:1 2 3 4 5 6
对于冒泡排序我们的思路就是要先写内层循环,然后再写外层循环,内层循环的次数是随着循环的进行而减少的,最后一次我们只需要比较两个数就行了,然后对于外层循环,同样也是只需要length-1就行了,我们可以通过将每次的循环结果打印出来就可以知道