冒泡排序(概念):将一组数据按照从小到大排序的排序方式。
当我们拿到一组需要排序的数据时,我们可以通过两层for循环嵌套将其按照由小到大的顺序排序。以下是我基于冒泡排序的两种不同写法。
第一种(先找最大值)
1.基本思想
一组有n个数的数据,我们先将这n个数中的最大数移到右边第一位,再将前(n-1)个数的最大数移到右边第二位,...... ,直到最小数移到左边第一位。经过简单分析可知,找每个最大数的过程循环了(n-1)次。在前 i 个数中找最大数并将其移到右边第(n-i) 位的过程中,我们将两两相邻的数相比较并把最大数移至后一位,即,我们先将第 1 位和第 2 位相比较,若第 1 位大于第 2 位,就将其与第 2 位交换位置,若第 2 位大于第 1 位则保持位置不变,再将第 2 位和第 3 位相比较,找到二者中的最大值放在第 3 个位置,...... ,依次循环,直到前 i 个数中的最大数移至右边第(n-i)位,两两相邻的数比较大小并将最大数移至后一位的过程循环了(i-1)次。
我们需要设置两层嵌套for循环语句,外层循环用于控制找每个最大数的次数,内层循环用于控制每次寻找最大数过程中两两相邻的数比较大小并将最大数移至后一位的次数。
例如:拿到一组4个元素的数组:2 、8 、5 、4
第一次找最大数:
先将第一个元素 2 与第二个元素 8 相比较,2<8 ,位置保持不变,再将第二个元素 8 与第三个元素 5 比较,8>5 ,将第二个元素 8 与第三个元素 5 交换位置得到新数组:2 、 5 、8 、4
再将第三个元素 8 和第四个元素 4 相比较,8>4, 将两者交换位置得到数组:2 、 5 、 4 、8
第二次找最大数:
将第一个数 2 和第二个数 5 相比较,2<5,位置保持不变,再将第二个数 5 和第三个数 4 相比较,5>4,将将第一个数 2 和第二个数 5 位置交换得到数组:2 、 4 、5 、8
第三次找最大数:
将第一个数 2 和第二个数 4 相比较,2<4 ,位置保持不变。
最终得到排序好的数组:2 、 4 、 5 、 8
2.代码实现
//创建一个数组用于接收需要排序的十个数
int []arr=new int[10];
Scanner sc=new Scanner(System.in);
System.out.println("请输入你要排序的十个数:");
for (int i = 0; i < arr.length; i++) {
arr[i]=sc.nextInt();
}
//遍历排序前的数组
System.out.println("排序前:");
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i]+" ");
}
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("排序后:");
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i]+" ");
}
第二种:(先找最小值)
1.基本思想
一组有n个数的数据,我们先将这n个数中的最小数移到左边第一位,再将后(n-1)个数的最小数移到左边第二位,...... ,直到最大数移到右边第一位。经过简单分析可知,移成功每个最小数的过程我们循环了(n-1)次。在后 i 个数中找最小数并将其移到左边边第(n-i) 位的过程中,我们将第 i 个数和 该数之后的每一个数相比较,若有数小于该数,则将两者交换,又继续将 i 索引处的数继续和后面的数进行比较,直到后 i 个数中的最小数移到左边第 i 个位置,此过程中第 i 个数与后面的数相比较的次数为(n-i)次。
我们需要设置两层嵌套for循环语句,外层循环用于控制移成功每个最小数的次数,内层循环用于控制将第 i 个数与后面的数相比较的次数。
例如:拿到一组4个元素的数组:2 、8 、5 、4
第一次找最小数:
先将第一个元素 2 与第二个元素 8 相比较,2<8 ,位置保持不变,再将第一个元素 2 与第三个元素 5 比较,,2<5,位置保持不变,最后将第一个元素与第四个元素相比较,4>2,位置保持不变。
第二次找最小数:
将第二个数 8 和第三个数 5 相比较,8>5,将二者位置交换,得到数组:2 、 5 、8 、4
再将第二个数 5 和第四个数 4 相比较,5>4,将二者交换位置,得到数组 :2 、 4 、8 、5
第三次找最小数:
将第三个数 8 和第四个数 5 相比较,8>5 ,将二者位置交换,得到数组:2 、 4 、 5 、 8
最终得到排序好的数组:2 、 4 、 5 、 8
2.代码实现
//创建一个数组用于接收需要排序的数
int []arr=new int[10];
Scanner sc=new Scanner(System.in);
System.out.println("请输入你要排序的十个数:");
for (int i = 0; i < arr.length; i++) {
arr[i]=sc.nextInt();
}
//遍历排序前的数组
System.out.println("排序前:");
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i]+" ");
}
for (int i = 0; i < arr.length-1; i++) {
for (int j = i+1; j < arr.length; j++) {
if(arr[i]>arr[j]){
int temp=arr[i];
arr[i]=arr[j];
arr[j]=temp;
}
}
}
遍历排序后的数组
System.out.println("排序后:");
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i]+" ");
}
运行代码结果: