归并排序

简介: 归并排序。

把数据分为两段,从两段中逐个选最小的元素移入新数据段的末尾。
可从上到下或从下到上进行。

include

include

// 函数声明
int min(int x, int y);
void merge_sort(int arr[], int len);

int main() {
int arr[] = { 22, 34, 3, 32, 82, 55, 89, 50, 37, 5, 64, 35, 9, 70 };
int len = sizeof(arr) / sizeof(arr[0]); // 计算数组长度

merge_sort(arr, len);  // 调用归并排序函数

// 打印排序后的数组
for (int i = 0; i < len; i++) {
    printf("%d ", arr[i]);
}

return 0;

}

// 返回两个数中的最小值
int min(int x, int y) {
return x < y ? x : y;
}

// 归并排序函数
void merge_sort(int arr[], int len) {
int a = arr;
int
b = (int) malloc(len sizeof(int));

if (b == NULL) {  // 检查内存分配是否成功
    fprintf(stderr, "Memory allocation failed\n");
    exit(EXIT_FAILURE);
}

for (int seg = 1; seg < len; seg += seg) {
    for (int start = 0; start < len; start += seg + seg) {
        int low = start;
        int mid = min(start + seg, len);
        int high = min(start + seg + seg, len);
        int k = low;
        int start1 = low, end1 = mid;
        int start2 = mid, end2 = high;

        // 合并两个子数组
        while (start1 < end1 && start2 < end2) {
            b[k++] = a[start1] < a[start2] ? a[start1++] : a[start2++];
        }
        while (start1 < end1) {
            b[k++] = a[start1++];
        }
        while (start2 < end2) {
            b[k++] = a[start2++];
        }
    }

    // 交换数组指针
    int* temp = a;
    a = b;
    b = temp;
}

// 如果a和arr不相同,则将a的内容复制回arr
if (a != arr) {
    for (int i = 0; i < len; i++) {
        b[i] = a[i];
    }
    b = a;
}

free(b);  // 释放内存

}

目录
相关文章
|
存储 编解码 算法
音视频之音频知识入门
信息论的观点来看,描述信源的数据是信息和数据冗余之和,即:数据=信息+数据冗余。音频信号在时域和频域上具有相关性,也即存在数据冗余。将音频作为一个信源,音频编码的实质是减少音频中的冗余。自然界中的声音非常复杂,波形极其复杂,通常我们采用的是脉冲代码调制编码,即PCM编码。PCM通过抽样、量化、编码三个步骤将连续变化的模拟信号转换为数字编码。
1224 0
|
10月前
|
存储 运维 NoSQL
【赵渝强老师】Redis的慢查询日志
Redis慢查询日志用于记录执行时间超过预设阈值的命令,帮助开发和运维人员定位性能问题。每条慢查询日志包含标识ID、发生时间戳、命令耗时及详细信息。配置参数包括`slowlog-max-len`(默认128)和`slowlog-log-slower-than`(默认10000微秒)。实战中可通过`slowlog get`获取日志、`slowlog len`查看长度、`slowlog reset`重置日志。建议线上环境将`slowlog-max-len`设为1000以上,并根据并发量调整`slowlog-log-slower-than`。需要注意的是,慢查询只记录命令执行时间。
496 5
|
10月前
|
NoSQL 关系型数据库 MySQL
分布式系统学习9:分布式锁
本文介绍了分布式系统中分布式锁的概念、实现方式及其应用场景。分布式锁用于在多个独立的JVM进程间确保资源的互斥访问,具备互斥、高可用、可重入和超时机制等特点。文章详细讲解了三种常见的分布式锁实现方式:基于Redis、Zookeeper和关系型数据库(如MySQL)。其中,Redis适合高性能场景,推荐使用Redisson库;Zookeeper适用于对一致性要求较高的场景,建议基于Curator框架实现;而基于数据库的方式性能较低,实际开发中较少使用。此外,还探讨了乐观锁和悲观锁的区别及适用场景,并介绍了如何通过Lua脚本和Redis的`SET`命令实现原子操作,以及Redisson的自动续期机
1042 7
|
Kubernetes API Docker
k8s 理论知识基本介绍
k8s 理论知识基本介绍
|
数据可视化 数据挖掘 数据处理
Python对Excel两列数据进行运算【从基础到高级的全面指南】
【7月更文挑战第6天】使用Python的`pandas`库处理Excel数据,涉及安装`pandas`和`openpyxl`,读取数据如`df = pd.read_excel(&#39;data.xlsx&#39;)`,进行运算如`df[&#39;Sum&#39;] = df[&#39;Column1&#39;] + df[&#39;Column2&#39;]`,并将结果写回Excel。`pandas`还支持数据筛选、分组、可视化、异常处理和性能优化。通过熟练运用这些功能,可以高效分析Excel表格。
|
jenkins Java 持续交付
jenkins学习笔记之十六:SonarSQube支持多分支
jenkins学习笔记之十六:SonarSQube支持多分支
|
机器学习/深度学习 数据可视化 算法
探索数据科学中的模型可解释性
在数据科学的领域中,模型的可解释性已成为一个日益重要的议题。本文将深入探讨为什么模型可解释性对于数据科学家至关重要,以及如何通过特定的方法提高模型的解释能力。我们将从理论和实践两个角度出发,分析模型可解释性的重要性,并介绍几种提高模型可解释性的技术手段,如特征重要性评估、局部可解释性模型以及模型可视化技术等。文章旨在为读者提供一套实用的工具和方法,以增强其数据模型的透明度和可信度。
|
存储 前端开发 安全
JavaScript进阶 - 浏览器存储:localStorage, sessionStorage, cookies
【7月更文挑战第2天】探索Web存储:localStorage持久化,sessionStorage会话限定,cookies则伴随HTTP请求。了解它们的特性和限制,如localStorage的5MB容量限制、跨域问题,sessionStorage的生命周期,及cookies的安全与带宽消耗。使用时需权衡安全、效率与应用场景。示例代码展示存储与检索方法。
1026 2
|
NoSQL Redis 索引
RedisTemplate.opsForList()用法简介并举例
RedisTemplate.opsForList()用法简介并举例
3022 2
|
前端开发 Java 关系型数据库
基于SSM实现网上购物商城系统
基于SSM实现网上购物商城系统
318 0