冒泡排序
冒泡排序就是把小的元素往前调或者把大的元素往后调。比较是相邻的两个元素比较,交换也发生在这两个元素之间。所以,如果两个元素相等,是不会再交换的;如果两个相等的元素没有相邻,那么即使通过前面的两两交换把两个相邻起来,这时候也不会交换,所以相同元素的前后顺序并没有改变,所以冒泡排序是一种稳定排序算法。
- 基本思路
我们假设有一个含有6个元素的int型的一维数组变量,他们分别是 2,7,8,9,6,4,我们对它们进行冒泡排序:
我们首先对前6个元素进行第一轮排序:
对比第0个元素和第1个元素,即2和7,因为2<7,不进行操作;
对比第1个元素和第2个元素,即7和8,因为7<8,不进行操作;
对比第2个元素和第3个元素,即8和9,因为8<9,不进行操作;
对比第3个元素和第4个元素,即9和6,因为9>6,交换;
现在数组序列 2,7,8,6,9,4;
对比第4个元素和第5个元素,即9和4,因为9>4,交换;
现在数组序列 2,7,8,6,4,9;
此时我们发现前6个数据的最大值‘9’已经“浮出”水面,我们下一步可以将前5个数据进行第二轮排序,让前5个数据的最大值“浮出”到倒数第二个位置。
我们再对前5个元素进行第二轮排序:
对比第0个元素和第1个元素,即2和7,因为2<7,不进行操作;
对比第1个元素和第2个元素,即7和8,因为7<8,不进行操作;
对比第2个元素和第3个元素,即8和6,因为8>6,交换;
现在数组序列 2,7,6,8,4,9;
对比第3个元素和第4个元素,即8和4,因为8>4,交换;
现在数组序列 2,7,6,4,8,9; 停止
此时我们发现前5个数据的最大值‘8’已经“浮出”到倒数第二个位置,我们下一步可以将前4个数据进行第三轮排序,让前4个数据的最大值“浮出”到倒数第三个位置。通过这种方法,以此类推,即可完成排序。
- JAVA 代码如下:
package DataStructure;
public class BubbleSort {
public static void sort(int[] arr) {
for (int i = 0; i < arr.length - 1; i++) {
for (int j = 0; j < arr.length - 1 - i; j++)
if (arr[j] > arr[j + 1]) {
int temp = arr[j + 1];
arr[j + 1] = arr[j];
arr[j] = temp;
}
}
}
public static void main(String[] args) {
int[] arr = { 2, 7, 8, 9, 6, 4 };
sort(arr);
for (int n : arr)
System.out.print(n + " ");
}
}
- 时间复杂度
若文件的初始状态是正序的,一趟扫描即可完成排序(需要优化代码)。冒泡排序最好的时间复杂度为 O(n)。
冒泡排序的最坏时间复杂度为 O(n²)。
综上,因此冒泡排序总的平均时间复杂度为 O(n²)。
网友评论