冒泡排序即每次遍历。相邻数字间进行比较,前者大于后者进行交换,不断将最大值后移,直至沉至最后位置;算法关键要点在于确定每次循环的边界;
后面两种算法则是对冒泡排序一定程度上的改良,但相对于其他排序算法,冒泡排序性能依然较差。
public class BubbleSort {
//最原始的解法
public static void bubble_sort1(int[] data) {
int n = data.length;
for (int i = 0; i < n; i++) {
// 注意循环的index范围,避免溢出
for (int j = 0; j < n - i - 1; j++) {
if (data[j] > data[j + 1]) {
swap(data, j, j + 1);
}
}
}
}
//改进算法,通过引入一个标志量flag,判断一次循环是否有移动,若无移动,则表示
//排序已经完成,无需在进行下一次继续循环
public static void bubble_sort2(int[] data) {
int n = data.length;
boolean flag = true;// 标示是否进行了移动
int index = n; // 标示需要循环的最后一位的index
// 一旦在移动,则继续循环
while (flag) {
flag = false;
for (int j = 0; j < index - 1; j++) {
if (data[j] > data[j + 1]) {
swap(data, j, j + 1);
flag = true;
}
}
index--;
}
}
//改进算法二:当一次遍历中,最后m位都未进行转换,则表示后面n位都比当前这个最大数要大
//根据冒泡排序知,每次沉入最大值,则后面这些位一定已经排好序
public static void bubble_sort3(int[] data) {
int n = data.length;
int index = n;
while (index != 0) {
int k = 0;
for (int j = 0; j < index - 1; j++) {
if (data[j] > data[j + 1]) {
swap(data, j, j + 1);
k = j + 1;
}
}
index = k;
}
}
private static void swap(int[] data, int a, int b) {
int temp = data[a];
data[a] = data[b];
data[b] = temp;
}
public static void print_array(int[] data) {
for (int num : data) {
System.out.print(num);
System.out.print(" ");
}
}
public static void main(String[] args) {
int[] datas = new int[100];
int max = 100;
int min = 10;
for (int i = 0; i < datas.length; i++)
datas[i] = (int) (Math.random() * (max - min) + min);
bubble_sort3(datas);
print_array(datas);
}
}