文章目录
- 前言
- 一、冒泡排序原理
- 二、代码实现
- 1.基础实现
- 2.代码优化
- 总结
前言
我之前发过一个关于冒泡排序(用C语言实现)的文章,但是感觉没有循序渐进,对于编程入门的小白不是很友好,所以我打算再发一篇关于冒泡排序的文章。
一、冒泡排序原理
对于编程入门的小伙伴来说,冒泡排序应该是最熟悉的排序方法了,那么让我们回顾一下冒泡排序的原理。
首先给出一个数组 int arr[4] 如下
8 | 3 | 5 | 2 |
比较第一个元素与第二个元素,如果arr[0]>arr[1]则交换arr[0]与arr[1],然后再让第二个元素与第三个元素比较,一直这么比较到最后一个元素,这样就可以让最大的元素排在数组的最末端位置。
3 | 5 | 2 | 8 |
可以将数组的末端想象成水面,大元素相当于大气泡,最大的气泡会最先浮出水面(挺形象的哈)
比完一次后,最大的元素已经排好了,接下来再次重复上述比较,就可以让第二大的元素排好。一直这么比,数组就排好了。
3 | 2 | 5 | 8 |
当然,这个思路有许多优化空间,但大体思路就是如此。
二、代码实现
1.基础实现
import java.util.Arrays;
public class work_1 {
public static void main(String[] args) {
//要修改该数组直接在大括号里该元素就可以
int arr[]=new int[]{6,3,8,9,1,3,4,2,5,9,0,2,8};
//arr.length代表该数组有多少元素,在这里代表13
System.out.println(Arrays.toString(arr));//以字符形式打印数组
//以下是冒泡排序基础写法
//外层循环控制循环次数
for (int i = 0; i < arr.length; i++) {
//内层循环控制下标
for (int j = 0; j < arr.length-1; j++) {
//要使arr[i+1]不越界,则当j+1==arr.length时,该循环进行最后一次,故j<arr.length-1
if(arr[j]>arr[j+1]){
//交换三连
int tmp=arr[j];
arr[j]=arr[j+1];
arr[j+1]=tmp;
}
}
}
System.out.println(Arrays.toString(arr));//以字符形式打印数组
}
}
2.代码优化
import java.util.Arrays;
public class work_1 {
public static void main(String[] args) {
int arr[]=new int[]{6,3,8,9,1,3,4,2,5,9,0,2,8};
System.out.println(Arrays.toString(arr));
//以下是冒泡排序优化写法
//当循环进行到最后一次时,只剩下了最后一个元素排在最前面,相当于已经排好了,故可以省略一次比较,即i<arr.length-1
int flage=0;//默认标记为0,代表该数组已经有序
for (int i = 0; i < arr.length-1; i++) {
//当排完一次后,之后不管怎么排,最后一个元素始终是最大的,故可以不用比较,它是有序的
//这样想的话,每次排序都会生成一个有序元素,所以循环下标无需遍历后面的有序元素,故j<arr.length-1-i
for (int j = 0; j < arr.length-1; j++) {
if(arr[j]>arr[j+1]){
int tmp=arr[j];
arr[j]=arr[j+1];
arr[j+1]=tmp;
flage=1;//如果存在元素交换,则代表该数组无序,仍然需要排序
}
}
if(flage==0){
//如果内层循环走完了一次都没有元素交换的话,说明该数组已经有序,无需排列,故跳出循环
break;
}else{
//若flage!=0,则该数组仍然需要排序,将flage恢复到默认值
flage=1;
}
}
System.out.println(Arrays.toString(arr));
}
}
总结
冒泡排序不难,下去手敲一遍一定可以理解的。