蓝桥java排序算法
1.归并排序:
1.原理:分治策略
分:将数组不断二分,直到每个子数组只有一个元素
治:对每个子数组进行排序
合:将已排序的子数组合并成一个完整的有序数组
2.理解
归并排序就像打扑克牌一样
有这样一堆乱序的扑克牌: [8, 3, 5, 1, 9, 2]
第一步:分治
原始: [8, 3, 5, 1, 9, 2]
↓ 分成两半
左边: [8, 3, 5] 右边: [1, 9, 2]
↓ 继续分 ↓ 继续分
[8,3] [5] [1,9] [2]
↓ 再分 ↓ ↓ 再分 ↓
[8] [3] [5] [1] [9] [2]
第二步:合并排序(治合)
现在每个小组只有1张牌,本身就是有序的,然后两两合并:
第一轮合并:
[8]和[3]合并 → 比较8和3,小的在前 → [3, 8]
[1]和[9]合并 → 比较1和9,小的在前 → [1, 9]
[5]和[2]保持不动(因为5和2不在同一组)当前状态:[[3,8], [5], [1,9], [2]]
继续比较:
第二轮合并:
[3,8]和[5]合并 → 比较3和5 → [3,5,8]
[1,9]和[2]合并 → 比较1和2 → [1,2,9]当前状态:[[3,5,8], [1,2,9]]
合并后在继续:
第三轮合并:
[3,5,8]和[1,2,9]合并:
比较3和1 → 1更小 → 取1
比较3和2 → 2更小 → 取2
比较3和9 → 3更小 → 取3
比较5和9 → 5更小 → 取5
比较8和9 → 8更小 → 取8
最后取9 → [1,2,3,5,8,9]
这里搞个简洁模板:
public class MergeSort {
public static void mergeSort(int[] arr) {
if (arr == null || arr.length < 2) return;
sort(arr, 0, arr.length - 1, new int[arr.length]);
}
private static void sort(int[] arr, int left, int right, int[] temp) {
if (left >= right) return;
int mid = left + (right - left) / 2;
sort(arr, left, mid, temp);
sort(arr, mid + 1, right, temp);
// 合并
int i = left, j = mid + 1, k = 0;
while (i <= mid && j <= right) {
if (arr[i] <= arr[j]) {
temp[k++] = arr[i++];
} else {
temp[k++] = arr[j++];
}
}
while (i <= mid) temp[k++] = arr[i++];
while (j <= right) temp[k++] = arr[j++];
// 复制回原数组
for (i = 0; i < k; i++) {
arr[left + i] = temp[i];
}
}
}
2.快速排序
