目的
记录自己的学习过程, 方便后续面试复习.
核心思想(掌握)
比较交换, 实现冒泡
// 冒泡排序
private static void bubbleSort(int[] arr) {
for (int i = 0; i < arr.length - 1; i++) {
for (int j = 0; j < arr.length - i - 1; j++) {
if (arr[j] > arr[j + 1]) {
swap(arr, j, j + 1);
}
}
}
}
// 交换
private static void swap(int[] arr, int j, int i) {
int temp = arr[j];
arr[j] = arr[i];
arr[i] = temp;
}
两种改进(知道就行)
思路1: 如果两两比较没有发生交换, 说明已经是排好序了, 不用再次冒泡了.
/**
* 减少冒泡次数
*
* @param arr 待排序数组
*/
private static void bubbleSortV1(int[] arr) {
for (int i = 0; i < arr.length - 1; i++) {
// 是否冒泡标识, 默认false
boolean isSwaped = false;
for (int j = 0; j < arr.length - i - 1; j++) {
if (arr[j] > arr[j + 1]) {
swap(arr, j, j + 1);
isSwaped = true;
}
}
if (!isSwaped) {
break;
}
}
}
思路2: 减少比较次数
/**
* 减少比较次数
*
* @param arr 待排序数组
*/
private static void bubbleSortV2(int[] arr) {
// 比较次数
int compareCount = arr.length - 1;
do {
// 表示最后一次交换索引位置
int last = 0;
for (int j = 0; j < compareCount; j++) {
if (arr[j] > arr[j + 1]) {
swap(arr, j, j + 1);
last = j;
}
}
compareCount = last;
} while (compareCount != 0);
}