冒泡排序算法详解(从前往后)
A. 从第一个元素开始进行两两比较,保证第(数组长度-1-i)的位置的上是最大的------升序
1.核心代码
for (int i = 0; i <numbers.length-1; i++) {
for (int j = 0; j <numbers.length-1-i; j++) {
//从第一个元素,进行两两比较,
// 前者比后者大就交换,保证最大的数都交换到了第(数组长度-1-i)个位置上去了
if(numbers[j]>numbers[j+1]){
int temp=numbers[j];
numbers[j]=numbers[j+1];
numbers[j+1]=temp;
}
}
}
2.常见问题点分析
2.1 如何进行冒泡排序???
目的:每次两两交换完后,保证第(数组长度-1-i)个位置是最大值
解决方案: 1.从第i个元素开始(初始为0),每次与后面的元素两两比较
2.若前者大于后者,则进行值的交换,否则进入下一次循环操作
3.当两两交换到最后位置(数组长度-1-i)的数时,本次交换结束
下一次两两交换的范围缩短1,然后进行下一轮两两比较
当执行完(数组长度-1)轮两两比较时,冒泡排序算法才执行结束
2.2 冒泡排序的循环次数为多少?
解决方案:循环次数=数组长度-1
2.3 冒泡排序具体操作(数字是这么移动的)过程
以数组int[] a=[6,3,4,1,-9]为列
排序次数 | 需要排序的数组部分 | 排序前的数组 | 排序后的数组 |
---|---|---|---|
第1次 | [6,3,4,1,-9] | [6,3,4,1,-9] | [3,4,1,-9,6] |
第2次 | [3,4,1,-9] | [3,4,1,-9,6] | [3,1,-9,4,6] |
第3次 | [3,1,-9] | [3,1,-9,4,6] | [1,-9,3,4,6] |
第4次 | [1,-9] | [1,-9,3,4,6] | [-9,1,3,4,6] |
2.4 为什么内层循环的判定条件为 j <numbers.length-1-i
理由:a.每两两交换一轮,范围缩小1,这与i的变化一直,因而-i
b.两两交换的首轮是交换到了数组的最后一个位置的数,
此位置为numbers.length-1
c.两两交换的次数为numbers.length-1-i
2.5 为啥条件numbers[j]>numbers[j+1]满足时,要进行两两交换?
解答: 每交换一次时,使得两者之中的较大值往后移动一格
(这样大数都会往后移动了—>直到遇见比之还大的数字就终止移动)
这样能在每轮两两交换完成后,最大值的下标为数组长度-1-i
2.6 两两交换一轮为多少次?
假设需要排序的数组长度为5,每次都符合交换条件
当需要把最大值移动到最后一个位置(下标4)时,需要两两交换4次
当需要把最大值移动到倒数第二个位置(下标3)时,需要两两交换3次
当需要把最大值移动到第3个位置(下标2)时,需要两两交换2次
当需要把最大值移动到第2个位置(下标1)时,需要两两交换1次
此时冒泡结束
因而两两交换次数=数组长度-1-i
3.运行截图
4.源代码
public class BubSort01 {
public static void main(String[] args) {
System.out.println("冒泡排序(从前往后)-----升序");
int[] numbers={6,3,4,1,-9};
System.out.println("排序前");
for (int temp01:numbers
) {
System.out.print(temp01+"\t");
}
for (int i = 0; i <numbers.length-1; i++) {
for (int j = 0; j <numbers.length-1-i; j++) {
//从第一个元素,进行两两比较,
// 前者比后者大就交换,
//保证最大的数都交换到了第(数组长度-1-i)个位置上去了
if(numbers[j]>numbers[j+1]){
int temp=numbers[j];
numbers[j]=numbers[j+1];
numbers[j+1]=temp;
}
}
System.out.println("\n第"+(i+1)+"次排序结果为:");
for (int temp02:numbers
) {
System.out.print(temp02+"\t");
}
}
System.out.println("\n冒泡排序的最终结果为: ");
for (int temp03:numbers
) {
System.out.print(temp03+"\t");
}
}
}
B. 从第一个元素开始进行两两比较,保证第(数组长度-1-i)的位置的上是最小的------降序
1.核心代码
for (int i = 0; i <numbers.length-1; i++) {
for (int j = 0; j <numbers.length-1-i; j++) {
//从第一个元素,进行两两比较,
// 前者比后者小就交换,保证最小的数都交换到了第数组长度-1-i个位置上去了
if(numbers[j]<numbers[j+1]){
int temp=numbers[j];
numbers[j]=numbers[j+1];
numbers[j+1]=temp;
}
}
}
2.常见问题点分析
2.1 如何进行冒泡排序???
目的:每次两两交换完后,保证第(数组长度-1-i)个位置是最小值
解决方案: 1.从第i个元素开始(初始为0),每次与后面的元素两两比较
2.若前者小于后者,则进行值的交换,否则进入下一次循环操作
3.当两两交换到最后位置(数组长度-1-i)的数时,本次交换结束
下一次两两交换的范围缩短1,然后进行下一轮两两比较
当执行完(数组长度-1)轮两两比较时,冒泡排序算法才执行结束
2.2 冒泡排序的循环次数(外层)为多少?
解决方案:循环次数=数组长度-1
2.3 冒泡排序具体操作(数字是这么移动的)过程
以数组int[] a=[4,1,-9,22,23]为列
排序次数 | 需要排序的数组部分 | 排序前的数组 | 排序后的数组 |
---|---|---|---|
第1次 | [4,1,-9,22,23] | [4,1,-9,22,23] | [4,1,22,23,-9] |
第2次 | [4,1,22,23] | [4,1,22,23,-9] | [4,22,23,1,-9] |
第3次 | [4,22,23] | [4,22,23,1,-9] | [22,23,4,1,-9] |
第4次 | [22,23] | [22,23,4,1,-9] | [23,22,4,1,-9] |
2.4 为什么内层循环的判定条件为 j <numbers.length-1-i
理由:a.每两两交换一轮,范围缩小1,这与i的变化一直,因而-i
b.两两交换的首轮是交换到了数组的最后一个位置的数,
此位置为numbers.length-1
c.两两交换的次数为numbers.length-1-i
2.5 为啥条件numbers[j]<numbers[j+1]满足时,要进行两两交换?
解答: 每交换一次时,使得两者之中的较小值往后移动一格
(这样小数都会往后移动了—>直到遇见比之还小的数字就终止移动)
这样能在每轮两两交换完成后,最大值的下标为数组长度-1-i
2.6 两两交换一轮为多少次?
假设需要排序的数组长度为5,每次都符合交换条件
当需要把最大值移动到最后一个位置(下标4)时,需要两两交换4次
当需要把最大值移动到倒数第二个位置(下标3)时,需要两两交换3次
当需要把最大值移动到第2个位置(下标2)时,需要两两交换2次
当需要把最大值移动到第1个位置(下标1)时,需要两两交换1次
此时冒泡结束
因而两两交换次数=数组长度-1-i
3.运行截图
4.源代码
public class BubSort02 {
public static void main(String[] args) {
System.out.println("冒泡排序(从前往后)-----降序");
int[] numbers={4,1,-9,22,23};
System.out.println("排序前");
for (int temp01:numbers
) {
System.out.print(temp01+"\t");
}
for (int i = 0; i <numbers.length-1; i++) {
for (int j = 0; j <numbers.length-1-i; j++) {
//从第一个元素,进行两两比较,
// 前者比后者小就交换,保证最小的数都交换到了第(数组长度-1-i)个位置上去了
if(numbers[j]<numbers[j+1]){
int temp=numbers[j];
numbers[j]=numbers[j+1];
numbers[j+1]=temp;
}
}
System.out.println("\n第"+(i+1)+"次排序结果为:");
for (int temp02:numbers
) {
System.out.print(temp02+"\t");
}
}
System.out.println("\n冒泡排序的最终结果为: ");
for (int temp03:numbers
) {
System.out.print(temp03+"\t");
}
}
}