冒泡排序是一种稳定排序,值相等的元素并不会打乱原本的顺序。
由于该排序算法的每一轮都要遍历所有元素吗,总共遍历(元素数量-1)轮,所以平均的时间复杂度是O(n2).
/**
* @Author: subd
* @Date: 2019/8/16 8:19
*/
public class BubbleSort {
public static void main(String[] args) {
int[] array = new int[]{5, 8, 6, 3, 9, 1, 2, 7};
sort1(array);
System.out.println(Arrays.toString(array));
array = new int[]{5, 8, 6, 3, 9, 1, 2, 7};
sort2(array);
System.out.println(Arrays.toString(array));
array = new int[]{3, 4, 2, 1, 5, 6, 7, 8};
sort3(array);
System.out.println(Arrays.toString(array));
}
/**
* 冒泡第一版
*
* @param array
*/
private static void sort1(int[] array) {
int tims = 0;
for (int i = 0; i < array.length - 1; i++) {
for (int j = 0; j < array.length - i - 1; j++) {
int tmp = 0;
if (array[j] > array[j + 1]) {
tmp = array[j];
array[j] = array[j + 1];
array[j + 1] = tmp;
}
tims++;
}
}
System.out.println("遍历次数:" + tims);
}
/**
* 冒泡第二版 加入验证有序
*
* @param array
*/
private static void sort2(int[] array) {
int tims = 0;
for (int i = 0; i < array.length - 1; i++) {
//有序标记,每一轮的初始值都是true;
boolean isSorted = true;
for (int j = 0; j < array.length - i - 1; j++) {
int tmp = 0;
if (array[j] > array[j + 1]) {
tmp = array[j];
array[j] = array[j + 1];
array[j + 1] = tmp;
//因为有元素进行交换,所以不是有序的,标记变为false
isSorted = false;
}
tims++;
}
//如果有序跳出本次循环。
if (isSorted) {
break;
}
}
System.out.println("遍历次数:" + tims);
}
/**
* 冒泡第三版 加入验证有序区
*
* @param array
*/
private static void sort3(int[] array) {
int tims = 0;
for (int i = 0; i < array.length - 1; i++) {
//有序标记,每一轮的初始值都是true;
boolean isSorted = true;
//无序数列的边界,每次比较只需要比较到这里为止。
int sortBorder = array.length - 1;
for (int j = 0; j < array.length - i - 1; j++) {
int tmp = 0;
if (array[j] > array[j + 1]) {
tmp = array[j];
array[j] = array[j + 1];
array[j + 1] = tmp;
//因为有元素进行交换,所以不是有序的,标记变为false
isSorted = false;
//把无序数列的边界更新为最后一次交换元素的位置。
sortBorder = j;
}
tims++;
}
//如果有序跳出本次循环。
if (isSorted) {
break;
}
}
System.out.println("遍历次数:" + tims);
}
}
本文深入讲解了冒泡排序算法的三种实现方式,包括基本冒泡排序、带有序验证的优化版以及结合有序区间验证的高级版。通过具体的代码示例,展示了如何减少不必要的遍历,提高排序效率。
1239

被折叠的 条评论
为什么被折叠?



