原理介绍

代码分析

image.png
纯模板:

  1. class Solution {
  2. public:
  3. // 自顶向下的归并排序;
  4. void mergeSort(vector<int> &arr, int size) {
  5. __mergeSort(arr, 0, size - 1);
  6. }
  7. // 递归 分解的过程, 知道递归到最小单元 ,两个数字的时候 开始合并;
  8. void __mergeSort(vector<int> &arr, int l, int r) {
  9. if (l >= r)return;
  10. int mid = l + ((r - l) >> 1);
  11. __mergeSort(arr, l, mid);
  12. __mergeSort(arr, mid + 1, r);
  13. // 优化1 : 如果此时arr[mid] < arr[mid+1] 代表已经有序;
  14. if (arr[mid] < arr[mid + 1]) {
  15. merge(arr, l, mid, r);
  16. }
  17. }
  18. void merge(vector<int> &arr, int l, int mid, int r) {
  19. vector<int> aux(r - l + 1);// 辅助数组;
  20. for (int i = l; i <= r; i++) {
  21. aux[i - l] = arr[i];
  22. }
  23. int i = l, j = mid + 1;
  24. // [l....mid....r] 合并
  25. //
  26. for (int k = l; k <= r; k++) {
  27. if (i > mid) {
  28. arr[k] = aux[j - l];
  29. j++;
  30. } else if (j > r) {
  31. arr[k] = aux[i - l];
  32. i++;
  33. } else if (aux[i - l] < aux[j - l]) { //升序 降序由这个地方控制;
  34. arr[k] = aux[i - l];
  35. i++;
  36. } else if (aux[i - l] >= aux[j - l]) { //升序 降序由这个地方控制;
  37. arr[k] = aux[j - l];
  38. j++;
  39. }
  40. }
  41. }
  42. };
  43. int main() {
  44. ios_base::sync_with_stdio(false);
  45. cin.tie(0);
  46. Solution slu;
  47. vector<int> arr = {6, 1, 3, 8, -2, 10};
  48. slu.mergeSort(arr, arr.size());
  49. for (int a:arr) {
  50. cout << a << " ";
  51. }
  52. return 0;
  53. }