public class DoubleBubbleSortTest {
public static void main(String[] args) {
int[] arr = { 15, 3, 65, 39, 36, 97, 56, 47, 29, 66 };
System.out.println("数组排序前:");
printArray(arr);
doubleBubbleSort(arr);
System.out.println("\n数组排序后:");
printArray(arr);
}
/**
* 双向冒泡排序
* 在每一趟排序中,正向冒泡排序将剩余所有元素中较大的元素,冒至剩余元素最右端,
反向冒泡排序将剩余所有元素中较小的元素,冒至剩余元素最左端
*/
public static void doubleBubbleSort(int[] arr) {
int length = arr.length;
for (int i = 0, j; i < length / 2; i++) { // N个数需N/2趟
for (j = i; j < length - 1 - i; j++) { // 每趟需要比较N-i次比较
if (arr[j] > arr[j + 1]) {
swap(arr, j, j + 1);
}
System.out.println("第" + (i + 1) + "次正向冒泡,排序结果:");
printArray(arr);
}
System.out.println();
// 添加一层循环,同时从右至左,则每当此for循环结束,较小的数往左边冒出
for (--j; j > i; j--) {
if (arr[j - 1] > arr[j]) {
swap(arr, j - 1, j);
}
System.out.println("第" + (i + 1) +"次反向冒泡,排序结果:");
printArray(arr);
}
System.out.println("");
}
}
/**
* 交换数组中x、y下标指向的元素值
*/
private static void swap(int[] arr, int x, int y) {
int temp = arr[x];
arr[x] = arr[y];
arr[y] = temp;
}
/**
遍历数组然后打印
*/
private static void printArray(int[] arr) {
for (int i = 0; i < arr.length; i++) {
System.out.print("\t" + arr[i]);
}
System.out.println();
}
}
|