c语言学习,归并排序

news/2025/2/26 5:46:12

C语言,归并排序是经典的分治算法,基本思想是将,待排序的数组分成两个子数组,分别对这两个子数组进行排序,然后将排序好的子数组合并成一个有序的数组。归并排序的时间复杂度为O(n log n),且具有稳定性。

示例:

// 合并有序子数组
void merge(int arr[], int left, int mid, int right) {
    int n1 = mid - left + 1;
    int n2 = right - mid;
 
    // 创建数组
    int* L = (int*)malloc(n1 * sizeof(int));
    int* R = (int*)malloc(n2 * sizeof(int));
 
    // 拷贝数据到数组L[]和R[]
    for (int i = 0; i < n1; i++)
        L[i] = arr[left + i];
    for (int j = 0; j < n2; j++)
        R[j] = arr[mid + 1 + j];
 
    // 合并数组到arr[left..right]
    int i = 0, j = 0, k = left;
    while (i < n1 && j < n2) {
        if (L[i] <= R[j]) {
            arr[k] = L[i];
            i++;
        } else {
            arr[k] = R[j];
            j++;
        }
        k++;
    }
 
    // 拷贝L[]剩余的元素(如果有)
    while (i < n1) {
        arr[k] = L[i];
        i++;
        k++;
    }
 
    // 拷贝R[]剩余的元素(如果有)
    while (j < n2) {
        arr[k] = R[j];
        j++;
        k++;
    }
 
    // 释放数组
    free(L);
    free(R);
}
 
// 归并排序
void mergeSort(int arr[], int left, int right) {
    if (left < right) {
        int mid = left + (right - left) / 2;
 
        // 递归排序两个子数组
        mergeSort(arr, left, mid);
        mergeSort(arr, mid + 1, right);
 
        // 合并两个已排序的子数组
        merge(arr, left, mid, right);
    }
}
 
// 打印数组
void printArray(int arr[], int size) {
    for (int i = 0; i < size; i++)
        printf("%d ", arr[i]);
    printf("\n");
}
 
// 主函数
int main() {
    int arr[] = {12, 11, 13, 5, 6, 7};
    int arr_size = sizeof(arr) / sizeof(arr[0]);
 
    printf("Given array is \n");
    printArray(arr, arr_size);
 
    mergeSort(arr, 0, arr_size - 1);
 
    printf("\nSorted array is \n");
    printArray(arr, arr_size);
    return 0;
}

 


http://www.niftyadmin.cn/n/5868091.html

相关文章

MFC案例:利用双缓冲技术绘制顶点可移动三角形

案例目标&#xff1a;在屏幕上出现一个三角形&#xff0c;同时显示各顶点坐标&#xff0c;当用鼠标选择某顶点并拖动时&#xff0c;三角形随鼠标移动而变形。具体步骤为&#xff1a; 一、在VS2022上建立一个基于对话框的MFC应用&#xff0c;项目名称&#xff1a;DrawMovableTr…

IDEA-插件开发踩坑记录-第五坑-没有飞机场导致无法访问GITHUB导致的讨厌问题

背景 在JetBrains-intellij-idea 插件开发时&#xff0c;出现一个不影响运行&#xff0c;但影响心情的错误提示&#xff1a; Cannot resolve the latest Gradle IntelliJ Plugin version org.gradle.api.GradleException: Cannot resolve the latest Gradle IntelliJ Plugin v…

《OpenCV》——实例:答题卡识别

答题卡识别 实例内容&#xff1a; 该实例实现了一个基于计算机视觉技术的答题卡自动识别与评分系统&#xff0c;利用 OpenCV 库对答题卡图像进行处理和分析&#xff0c;最终得出答题卡的得分。 实例步骤&#xff1a; 导入必要的库 import numpy as np import cv2导入num…

hot100_108. 将有序数组转换为二叉搜索树

hot100_108. 将有序数组转换为二叉搜索树 思路 给你一个整数数组 nums &#xff0c;其中元素已经按 升序 排列&#xff0c;请你将其转换为一棵 平衡 二叉搜索树。 示例 1&#xff1a; 输入&#xff1a;nums [-10,-3,0,5,9] 输出&#xff1a;[0,-3,9,-10,null,5] 解释&#…

基于 spring boot+vue 的仓储管理系统 的设计与实现

下载链接 1 引言 随着全球化的加速和国际互联网技术的飞速发展&#xff0c;越来越多的企业开始构 建自己的电子商务平台。在这个信息化时代&#xff0c;基于网络的信息服务和商务服务 已经成为现代企业运营的核心组成部分。不再满足于仅有发布信息功能的静态 网站&#xff0…

TDengine 产品组件:taosExplorer

taosExplorer 是一个为用户提供 TDengine 实例的可视化数据库管理交互工具的 web 服务&#xff0c;使用浏览器打开。虽然它没有开源&#xff0c;但随开源版安装包免费提供。 本节主要讲述其安装和部署。它的各项功能都是基于简单易上手的图形界面&#xff0c;可以直接尝试&…

vscode多文件编译构建(CMake)和调试C++

目录 1. CMake 基础构建工具及作用相关配置文件 2. 配置 tasks.json关键字段详细解释 3. 配置 launch.json关键字段详细解释 4. 配置 CMakeLists.txt关键部分详细解释 5. 构建和调试项目1. 仅构建项目1.1 任务执行顺序1.2 cmake 任务执行详情1.3 build 任务执行详情1.4 构建后的…

tensorflow + sionna 安装踩坑记录(待补充)

1.本人基础配置 cpu笔记本一台&#xff0c;使用mobaxterm远程控制gpu服务器&#xff0c; 没有sudo权限。 2.Tensorflow安装 请打开官方英文版安装介绍 https://tensorflow.google.cn/install/pip&#xff0c;中文版可能会缺失部分提示信息。 conda create -n tf_sionna pyt…