- 程序员不仅要学会敲代码,更要学会算法与数据结构,算法与数据结构是程序员的必修课程,今天我就来讲讲如何理解并进行实践冒泡排序。
- 对冒泡排序的理解:
题目:请把(3 2 1 8 10 6 4 9)按照从小到大的顺序用冒泡排序排列出来
参与排序的数字;3 2 1 8 10 6 4 9
第一次循环:
2 3 1 8 10 6 4 9(2与3比较):不交换
2 1 3 8 10 6 4 9(3与1比较):交换
2 1 3 8 10 6 4 9(3与8比较):不交换
2 1 3 8 10 6 4 9(8与10比较):不交换
2 1 3 8 6 10 4 9(10与6比较):交换
2 1 3 8 6 4 10 9(10与4比较):交换
2 1 3 8 6 4 9 10(10与9比较):交换
此时最右边的数字为10,将10冒出来。
参与排序的数字:2 1 3 8 6 4 9
第二次循环:
1 2 3 8 6 4 9(2与1比较):交换
1 2 3 8 6 4 9(2与3比较):不交换
1 2 3 8 6 4 9(3与8比较):不交换
1 2 3 6 8 4 9(8与6比较):交换
1 2 3 6 4 8 9(8与4比较):交换
1 2 3 6 4 8 9(8与9比较):不交换
此时最右边的数字为9,将9冒出来。
参与排序的数字:1 2 3 6 4 8
第三次循环:
1 2 3 6 4 8(1与2比较):不交换
1 2 3 6 4 8(2与3比较):不交换
1 2 3 6 4 8(3与6比较):不交换
1 2 3 4 6 8(6与4比较):交换
1 2 3 4 6 8(6与8比较):不交换
此时最右边的数字为8,将8冒出来。
参与排序的数字:1 2 3 4 6
第四次循环:
1 2 3 4 6(1与2比较):不交换
1 2 3 4 6(2与3比较):不交换
1 2 3 4 6(3与4比较):不交换
1 2 3 4 6(4与6比较):不交换
此时最右边的数字为6,将6冒出来。
参与排序的数字:1 2 3 4
第五次循环:
1 2 3 4(1与2比较):不交换
1 2 3 4(2与3比较):不交换
1 2 3 4(3与4比较):不交换
此时最右边的数字为4,将4冒出来。
参与排序的数字:1 2 3
第六次循环:
1 2 3(1与2比较):不交换
1 2 3(2与3比较):不交换
此时最右边的数字为3,将3冒出来。
参与排序的数字:1 2
第七次循环:
1 2(1与2比较):不交换
此时最右边的数字为2,将2冒出来。
上面题目中可以看出来冒泡排序算法的步骤,从步骤中可以看出:
八个数字七次比较
七个数字六次比较
六个数字五次比较
…
从中可以推断出当有N个数字时,有N-1次比较。
此时我们可以用代码把它写出来:
public class Test {
public static void main (String[] args) {
bubbling();
}
// 冒泡排序的方法
public static void bubbling () {
// 这里定义一个数组,数组当中设置好元素
int[] array = {3, 2, 1, 8, 10, 6, 4, 9};
// 外层for循环是用来判断数组中元素的个数
for (int m = array.length; m > 0 ; m --) {
// 内层for循环是用来做冒泡中的比较的(N个元素比较N-1次)
for (int n = 0 ; n < m - 1 ; n ++) {
// 当左边的元素大于右边的元素时
if(array[n] > array[n + 1]) {
// 左边的元素与右边的元素交换位置
int temp = array[n];
array[n] = array[n + 1];
array[n + 1] = temp;
}
}
}
// 将所得的新的array数组进行遍历
for (int i = 0 ; i < array.length; i ++) {
System.out.print(array[i] + " ");
}
}
}
输出结果:1 2 3 4 6 8 9 10