排序算法---归并排序

news2024/11/15 18:56:13

原创不易,转载请注明出处。欢迎点赞收藏~

归并排序是一种常见的排序算法,它采用了分治的思想。它将一个待排序的数组递归地分成两个子数组,分别对两个子数组进行排序,然后将排好序的子数组合并成一个有序数组。

具体的归并排序过程如下:

  1. 将待排序的数组不断地二分,直到每个子数组只剩下一个元素。
  2. 对每个子数组进行合并操作,即将两个有序的子数组合并成一个有序数组。合并操作是通过比较两个子数组的首元素,选取较小的元素放入临时数组中,然后移动相应的指针,重复此过程直到其中一个子数组为空,再将另一个子数组中的剩余部分直接放入临时数组中。
  3. 重复步骤2,直到所有的子数组都被合并成一个有序数组。

归并排序的时间复杂度为 O(nlogn),其中 n 表示待排序数组的长度。这是因为在每一层递归中,需要将所有的子数组都进行合并,而合并两个长度为 n 的有序数组的时间复杂度为 O(n)。总共需要进行 logn 层的递归,因此时间复杂度为 O(nlogn)。

归并排序的空间复杂度为 O(n),主要是由于合并过程中需要使用一个临时数组来存储排序结果。

归并排序是一种稳定的排序算法,适用于各种规模的数据集。但由于它需要额外的空间来存储临时数组,所以在处理大规模数据时,可能会占用较多的内存。

以下是一个基于C语言的归并排序示例:

#include <stdio.h>

// 合并两个有序数组
void merge(int arr[], int left[], int leftSize, int right[], int rightSize)
{
    int i = 0, j = 0, k = 0;

    // 比较两个子数组的元素,将较小的元素放入原始数组arr中
    while (i < leftSize && j < rightSize)
    {
        if (left[i] <= right[j])
        {
            arr[k++] = left[i++];
        }
        else
        {
            arr[k++] = right[j++];
        }
    }

    // 将剩余部分的元素放入arr中
    while (i < leftSize)
    {
        arr[k++] = left[i++];
    }
    while (j < rightSize)
    {
        arr[k++] = right[j++];
    }
}

// 归并排序
void merge_sort(int arr[], int size)
{
    // 递归终止条件:当数组只有一个元素时,无需继续划分
    if (size <= 1)
    {
        return;
    }

    int mid = size / 2;
    int left[mid];
    int right[size - mid];

    // 将数组划分为两个子数组
    for (int i = 0; i < mid; i++)
    {
        left[i] = arr[i];
    }
    for (int i = mid; i < size; i++)
    {
        right[i - mid] = arr[i];
    }

    // 对两个子数组分别进行归并排序
    merge_sort(left, mid);
    merge_sort(right, size - mid);

    // 合并两个有序子数组
    merge(arr, left, mid, right, size - mid);
}

int main()
{
    int arr[] = {7, 2, 4, 1, 5, 3};
    int size = sizeof(arr) / sizeof(arr[0]);

    printf("排序前的数组:\n");
    for (int i = 0; i < size; i++)
    {
        printf("%d ", arr[i]);
    }

    merge_sort(arr, size);

    printf("\n排序后的数组:\n");
    for (int i = 0; i < size; i++)
    {
        printf("%d ", arr[i]);
    }
    putchar('\n');

    return 0;
}

这段代码实现了归并排序算法。归并排序是一种基于分治思想的排序算法,它将待排序的数组分成两个子数组,分别进行排序,然后合并两个有序的子数组,从而得到完整的有序数组。

代码中的merge()函数用于合并两个有序数组。它通过比较两个子数组的元素,将较小的元素依次放入原始数组arr中。最后,将剩余部分的元素放入原始数组中,以确保所有元素都被归并到正确的位置。

merge_sort()函数是归并排序的核心部分。它首先递归地将数组划分为两个子数组,然后对这两个子数组分别调用merge_sort()函数进行排序。最后,调用merge()函数将两个有序的子数组合并为一个有序数组。

在main()函数中,我们声明了一个整型数组arr并初始化了一些元素。然后,我们调用merge_sort()函数对数组进行归并排序,并打印原始数组和排序后的数组。

最终输出的结果是原始数组和排序后的数组。你可以根据需要修改输入的数组和数组长度,来验证归并排序的效果。

运行如上代码,你可以看到以下输出:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1440955.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Docker部署前端项目

某次阿里云的自动流水线失败了&#xff0c;代码本地跑起来莫得问题&#xff0c;错误日志提示让我跑一下npm run build &#xff0c;但是俺忽然发现&#xff0c;我跑了&#xff0c;文件打包好了&#xff0c;但是往哪里运行呢&#xff1f;这涉及到要构建一个环境供打包文件部署吧…

Git的基础操作指令

目录 1 前言 2 指令 2.1 git init 2.2 touch xxx 2.3 git status 2.4 git add xxx 2.5 git commit -m xxxx 2.5 git log及git log --prettyoneline --all --graph --abbrev-commit 2.6 rm xxx 2.7 git reset --hard xxx(含小技巧) 2.8 git reflog 2.9 mv xxx yyy 1…

计算机考研数学】张宇1000题和660哪个更难?

1000题和660题都很难&#xff0c;难的不一样 660题是对于基础深入考察的难 660题是非常经典的客观题练习题&#xff0c;题目难度中等&#xff0c;不难但是每一道题都需要认真的思考才能做出来。如果660题能够吃透&#xff0c;并且每一道题的方法都能够灵活掌握的话&#xff0…

Python Paramiko 使用交互方式获取终端输出报错

近期接到一个需求&#xff0c;要批量登录网络设备获取配置。 原计划使用 Paramiko exec即可&#xff0c;但是后来发现&#xff0c;有些设备命令也执行了&#xff0c;但是没有回显。 于是尝试使用 invoke_shell() 方式。 前期调试倒是OK&#xff0c;直到遇见一个输出内容较长的…

python-pandas查漏补缺

1. create labels for Series 2. 3. 4. 用平均数等去填empty的格子 5. 6. 7.

读千脑智能笔记08_人工智能的未来(下)

1. 机器智能存在的风险 1.1. “人工智能”这个名字应用到几乎所有涉及机器学习的领域 1.2. 技术专家对人工智能的态度也从“人工智能可能永远不会实现”快速转变为“人工智能可能在不久的将来毁灭所有人类” 1.3. 每一项新技术都可能会被滥用…

springboo冬奥会科普平台源码和论文

随着信息技术和网络技术的飞速发展&#xff0c;人类已进入全新信息化时代&#xff0c;传统管理技术已无法高效&#xff0c;便捷地管理信息。为了迎合时代需求&#xff0c;优化管理效率&#xff0c;各种各样的管理平台应运而生&#xff0c;各行各业相继进入信息管理时代&#xf…

【Flink入门修炼】1-1 为什么要学习 Flink?

流处理和批处理是什么&#xff1f; 什么是 Flink&#xff1f; 为什么要学习 Flink&#xff1f; Flink 有什么特点&#xff0c;能做什么&#xff1f; 本文将为你解答以上问题。 一、批处理和流处理 早些年&#xff0c;大数据处理还主要为批处理&#xff0c;一般按天或小时定时处…

Ubuntu 22 部署Zabbix 6.4

一、安装及配置postgresql sudo apt-get update sudo apt-get install postgresql postgresql-client 修改配置文件&#xff0c;配置远程访问&#xff1a;&#xff08;PostgreSQL安装路径下的data&#xff0c;也是安装时data的默认路径&#xff09;data目录下的 pg_hba.conf …

火星文:网络时代下的语言

引言 在互联网时代&#xff0c;网络语言的发展日新月异。火星文作为一种特殊的网络表达方式&#xff0c;近年来逐渐兴起并成为了网络文化的一部分。 火星文生成器 | 一个覆盖广泛主题工具的高效在线平台(amd794.com) https://amd794.com/huoxingwen 火星文的兴起时代 火星…

为什么是0.1uF电容?

旁路电容是电子设计中常用的电容器之一&#xff0c;主要用于过滤电源噪声和稳定电源电压。在实际应用中&#xff0c;0.1uF电容器是最常用的旁路电容值之一&#xff0c;那么为什么常用旁路电容是0.1uF而不是其他值&#xff1f;这个值又是怎么来的呢&#xff1f;本文将深入探讨这…

FPGA_简单工程_数码管静态显示

一 理论 数码管是一种半导体发光器件&#xff0c;基本单位是发光二极管。 以六位八段数码管为例&#xff0c;每段需要一个端口信号&#xff0c;6814位。 74HC595芯片&#xff1a; 8位串行输入&#xff0c;并行输出的位移缓存器&#xff0c;其内部具有8位移位寄存器和一个存储…

[WUSTCTF2020]朴实无华(特详解)

一开始说header出问题了 就先dirsaerch扫一遍 发现robot.txt 访问一下 去看看&#xff0c;好好好&#xff0c;肯定不是得 他一开始说header有问题&#xff0c;不妨抓包看看&#xff0c;果然有东西 访问看看&#xff0c;乱码修复一下&#xff0c;在之前的博客到过 <img src…

如何连接ChatGPT?无需科学上网,使用官方GPT教程

随着AI的发展&#xff0c;ChatGPT也越来越强大了。 它可以帮你做你能想到的几乎任何事情&#xff0c;妥妥的生产力工具。 然而&#xff0c;对于许多国内的用户来说&#xff0c;并不能直接使用ChatGPT&#xff0c;不过没关系&#xff0c;我最近发现了一个可以直接免科学上网连…

【征稿已开启】第五大数据、人工智能与软件工程国际研讨会(ICBASE 2024)

第五大数据、人工智能与软件工程国际研讨会&#xff08;ICBASE 2024&#xff09; 2024 5th International Conference on Big Data & Artificial Intelligence & Software Engineering 2024年09月20-22日 | 中国温州 第五届大数据、人工智能与软件工程国际研讨会&…

windows11安装SQL server数据库报错等待数据库引擎恢复句柄失败

官网&#xff1a;https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 我的系统是win11的&#xff0c;一开始安装的是2019版本的SQL server安装了好多次&#xff0c;每次都是快结束的时候报错&#xff1a;等待数据库引擎恢复句柄失败。 我以为是2019不兼容win11的…

Qt未来市场洞察

跨平台开发&#xff1a;Qt作为一种跨平台的开发框架&#xff0c;具有良好的适应性和灵活性&#xff0c;未来将继续受到广泛应用。随着多设备和多平台应用的增加&#xff0c;Qt的前景在跨平台开发领域将更加广阔。 物联网应用&#xff1a;由于Qt对嵌入式系统和物联网应用的良好支…

Qlik Sense : where exists

什么是Exists函数 Exists() 用于确定是否已经将特定字段值加载到数据加载脚本中的字段。此函数用于返回 TRUE 或 FALSE&#xff0c;这样它可以用于 LOAD 语句或 IF 语句中的 where 子句。 信息注释您也可使用 Not Exists() 来确定是否尚未加载字段值&#xff0c;但是如果要在…

uni使用openlayer加载本机离线地图

manifest.json添加配置 "runmode": "liberate"(默认为normal) 把地图打包进apk&#xff0c;这样手机每次访问地图就可以访问到工程文件夹的地图资源了&#xff0c;不用每次都请求云资源&#xff0c;消耗流量太大了

嵌入式单片机中晶振的工作原理

晶振在单片机中是必不可少的元器件&#xff0c;只要用到CPU的地方就必定有晶振的存在&#xff0c;那么晶振是如何工作的呢&#xff1f; 什么是晶振 晶振一般指晶体振荡器&#xff0c;晶体振荡器是指从一块石英晶体上按一定方位角切下的薄片&#xff0c;简称为晶片。 石英晶体谐…