给定两个有序数列,合并成一个新的升序数列

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. int main(){
  4. const int SIZE = 100;
  5. int na,nb,a[SIZE],b[SIZE],i,j,k;
  6. cin >> na;
  7. for(i = 1 ; i <= na, i++){
  8. cin >> a[i];
  9. }
  10. cin >> nb;
  11. for(i = 1 ; i <= nb ,i++){
  12. cin >> b[i];
  13. }
  14. i = 1 ;
  15. j = 1 ;
  16. while((i <= na) && (i < nb)){
  17. if(a[i] <= b[j]){
  18. cout << a[i ] << ' ';
  19. i++;
  20. }else{
  21. cout << b[j] << ' ';
  22. j++;
  23. }
  24. }
  25. if(i <= na){
  26. for(k = i ; k < na ; k++){
  27. cout << a[k]<< ' ';
  28. }
  29. }(i <= nb){
  30. for(k = j ; k < nb ; k++){
  31. cout << b[k]<< ' ';
  32. }
  33. }
  34. return 0;
  35. }

归并排序

1. 算法介绍

归并排序是一种高效的 分治法(Divide and Conquer) 排序算法,核心思想:

1️⃣ 分解:将数组递归拆分为最小单位(单个元素)

2️⃣ 合并:将有序子数组合并为更大有序数组

✅ 时间复杂度:最优/平均/最坏均为 O(n log n)

✅ 稳定性:稳定排序(相同元素顺序不变)

✅ 适用场景:大数据量、链表排序、外部排序

2. 分治思想图解

  1. 初始数组: [38, 27, 43, 3, 9, 82, 10]
  2. 分解
  3. [38, 27, 43] [3, 9, 82, 10]
  4. 分解 分解
  5. [38] [27, 43] [3,9] [82,10]
  6. 合并 合并
  7. [27, 38, 43] [3,9,10,82]
  8. 合并
  9. [3,9,10,27,38,43,82]

3. 合并操作详解

核心步骤:合并两个有序数组

  1. Left数组: [27, 38, 43] Right数组: [3, 9, 10, 82]
  2. Step1: 比较左首(27) vs 右首(3) 取较小值 3
  3. Step2: 比较 27 vs 9 9
  4. Step3: 比较 27 vs 10 10
  5. Step4: 直接追加左数组:[27,38,43]
  6. 结果:[3, 9, 10, 27, 38, 43, 82]

4. C++ 代码实现

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. int arr[9] = {11,22,66,77,33,55,44,88};
  4. int brr[9];
  5. void merge(int l , int mid , int r){
  6. int i = l ;
  7. int k = l;
  8. int j = mid + 1 ;
  9. while((i <= mid) && (j <=r)){
  10. if(arr[i] >arr[j]){
  11. brr[k++] = arr[i++];
  12. }else{
  13. brr[k++] = arr[j++];
  14. }
  15. }
  16. if(i <= mid){
  17. for(k = i ; k < mid ; k++){
  18. cout << arr[k]<< ' ';
  19. }
  20. }else{
  21. for(k = j ; k < r ; k++){
  22. cout << brr[k]<< ' ';
  23. }
  24. }
  25. while(i <= mid){
  26. brr[k++] = arr[i++];
  27. }
  28. while(j <= r){
  29. brr[k++] = arr[j++];
  30. }
  31. for (int i = l ; i <= r ; i ++){
  32. arr[i] = brr[i];
  33. }
  34. }
  35. void mergeSort(int l , int r){
  36. if(l >= r) return ;
  37. int mid = (l+r)/2;
  38. mergeSort(l,mid);
  39. mergeSort(mid+1 , r);
  40. merge(l,mid,r);
  41. }
  42. int main(){
  43. mergeSort(1,8);
  44. return 0;
  45. }

5. 关键点分析

🔹 递归深度:共 log₂n 层分解

🔹 合并成本:每层合并需 O(n) 操作

🔹 空间复杂度:O(n)(临时数组开销)

🔹 优化策略:

  • 小数组用插入排序减少递归开销
  • 避免频繁内存分配(全局复用 temp 数组)

6. 与快速排序对比

第四节 - 图1