归并排序算法

归并排序采用分治的思想,现将数组分裂成更小的单元,将小单元的先进性排序,然后逐次合并,启时间复杂度nlogn,由于需要另加一个辅助数组空间复杂度为O(n)

1、分裂

cpp 复制代码
/**
 * 分裂操作
 */
void  merge_sort(int* arr,int left, int right){
  if (left >= right)
    return;
  
  int mid = (left + right) / 2;
  // 分裂操作
  merge_sort(arr, left, mid);
  merge_sort(arr, mid + 1, right);
  // 合并操作
  int* temp = (int*) malloc((right-left)* sizeof(int));
  merge(arr,temp,left,mid,right);
  free(temp);
}

2、合并

cpp 复制代码
/**
 * 合并操作
 */

void merge(int *arr,int* temp,  int left, int mid, int right){
  printf("合并索引: left=%d,mid=%d,right=%d\n", left, mid, right);
  int i = left;
  int j = mid + 1;
  int k = 0;
  // 合并两个有序数组到temp数组中
  while (i <= mid && j <= right) {
    if (arr[i] <= arr[j]) {
      temp[k++] = arr[i++];
    } else {
      temp[k++] = arr[j++];
    }
  }
  // 把左边剩余元素填充进temp数组中

  for (; i <= mid; i++) {
    temp[k++] = arr[i];
  }
  // 把右边剩余元素填充进temp数组中
  for (; j <= right; j++) {
    temp[k++] = arr[j];
  }
// 把temp数组中的元素拷贝回原数组中

  k = 0;
  int tempLeft = left;
  while (tempLeft <= right) {
    arr[tempLeft++] = temp[k++];
  }
}

3、测试

cpp 复制代码
    int arr[] = {11,15,3,5,9,80,90,73,50,66};
    int len = sizeof(arr)/sizeof(arr[0]);
    merge_sort(arr, 0, len-1);
相关推荐
dialect_6 小时前
KMP算法
开发语言·c++·算法
reikocao6 小时前
卡尔曼滤波的动态机制:P如何改变融合权重
算法
漂流瓶jz7 小时前
UVA-1612 猜名次 题解答案代码 算法竞赛入门经典第二版
数据结构·算法·题解·排序·aoapc·算法竞赛入门经典
吞下星星的少年·-·7 小时前
Div.2 CF 1130B题(构造,贪心)
算法·贪心·构造
是main不是漫8 小时前
【双指针——移动零】数组划分类题目的入门基石
c++·算法
深圳市快瞳科技有限公司9 小时前
野外鸟类AI识别落地实录:输入适配、结构化输出、去重聚合与置信度分流的工程实践
算法·计算机视觉·鸟类识别·鸟类ai识别·野外鸟类观测·林业调查
专注仿真11 小时前
梯度提升类(XFBoost)算法详解与代码实例
开发语言·人工智能·python·算法·大模型训练·控制算法
小豆庄11 小时前
视频遮罩追踪退场后ID撞号的排查—多目标场景下的失效
opencv·算法·bug·视频·python3.11
Tisfy11 小时前
LeetCode 3882.网格图中最小异或路径:动态规划
算法·leetcode·动态规划
D e re k ZH12 小时前
P5025 [SNOI2017] 炸弹
c++·算法