排序算法---归并排序

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

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

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

  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://xiahunao.cn/news/2776544.html

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

相关文章

上位机图像处理和嵌入式模块部署(上位机和下位机通信)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 一般情况下&#xff0c;如果是纯上位机开发的话&#xff0c;这个时候是不需要上位机和下位机进行通信的。只有上位机做好demo有必要移植到嵌入式模…

Modern C++ 内存篇1 - std::allocator VS pmr

大年三十所写&#xff0c;看到就点个赞吧&#xff01;祝读者们龙年大吉&#xff01;当然有问题欢迎评论指正。 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1. 前言 从今天起我们开始内存相关的话题&#xff0c;内存是个很大的话题&#xff0c;一时不…

containerd中文翻译系列(十九)cri插件

cri插件包含的内容比较多&#xff0c;阅读之前请深呼吸三次、三次、三次。 CRI 插件的架构 本小节介绍了 containerd 的 cri 插件的架构。 该插件是 Kubernetes 容器运行时接口&#xff08;CRI&#xff09; 的实现。Containerd与Kubelet在同一个节点上运行。containerd内部的…

2024年10 个好用的AI简历工具盘点推荐

在职场竞争激烈的今天&#xff0c;一份出色的简历就像是你的秘密武器&#xff0c;能帮你在众多候选人中脱颖而出&#xff0c;赢得面试宝座。随着 ChatGPT 引领的 AI 浪潮席卷而来&#xff0c;各式各样的 AI 简历工具如雨后春笋般涌现。面对这样的背景&#xff0c;神器集今天为大…

【GAMES101】Lecture 19 透镜

目录 理想的薄透镜 模糊 利用透镜模型做光线追踪 景深&#xff08;Depth of Field&#xff09; 理想的薄透镜 在实际的相机中都是用的一组透镜来作为这个镜头 这个因为真实的棱镜无法将光线真正聚焦到一个点上&#xff0c;它只能聚在一堆上 所以方便研究提出了一种理想化的…

Lombok 高级说明

优质博文&#xff1a;IT-BLOG-CN 一、痛点 【1】代码臃肿&#xff1a;POJO中的getter/setter/equals/hashcode/toString等&#xff1b; 【2】样板式代码&#xff1a;I/O流的关闭操作等&#xff1b; Lombok是一个可以通过注解简化Java代码开发的工具&#xff0c;能够在我们编…

《Python 网络爬虫简易速速上手小册》第2章:网络爬虫准备工作(2024 最新版)

文章目录 2.1 选择合适的爬虫工具和库2.1.1 重点基础知识讲解2.1.2 重点案例&#xff1a;使用 Scrapy 抓取电商网站2.1.3 拓展案例 1&#xff1a;使用 Requests 和 BeautifulSoup 抓取博客文章2.1.4 拓展案例 2&#xff1a;使用 Selenium 抓取动态内容 2.2 设置开发环境2.2.1 重…

Python爬虫requests库详解#3

使用 requests 上一节中&#xff0c;我们了解了 urllib 的基本用法&#xff0c;但是其中确实有不方便的地方&#xff0c;比如处理网页验证和 Cookies 时&#xff0c;需要写 Opener 和 Handler 来处理。为了更加方便地实现这些操作&#xff0c;就有了更为强大的库 requests&…

Go语言每日一练——链表篇(四)

传送门 牛客面试笔试必刷101题 ----------------合并两个排序的链表 题目以及解析 题目 解题代码及解析 package main import _"fmt" import . "nc_tools" /** type ListNode struct{* Val int* Next *ListNode* }*//*** 代码中的类名、方法名、参…

flink反压及解决思路和实操

1. 反压原因 反压其实就是 task 处理不过来&#xff0c;算子的 sub-task 需要处理的数据量 > 能够处理的数据量&#xff0c;比如&#xff1a; 当前某个 sub-task 只能处理 1w qps 的数据&#xff0c;但实际上到来 2w qps 的数据&#xff0c;但是实际只能处理 1w 条&#…

基于OpenCV灰度图像转GCode的斜向扫描实现

基于OpenCV灰度图像转GCode的斜向扫描实现基于OpenCV灰度图像转GCode的斜向扫描实现 引言激光雕刻简介OpenCV简介实现步骤 1.导入必要的库2. 读取灰度图像3. 图像预处理4. 生成GCode5. 保存生成的GCode6. 灰度图像斜向扫描代码示例 总结 系列文章 ⭐深入理解G0和G1指令&…

害怕跟别人进行社交,怎么办?

前几天&#xff0c;跟一位朋友&#xff0c;小聚了一下。 这位朋友&#xff0c;在一家大型 IT 公司里当技术主管。收入不低&#xff0c;烟酒不沾&#xff0c;常常健身&#xff0c;外型不错&#xff0c;为人也踏实可靠。除了有一点技术宅的死板之外&#xff0c;可以说是非常理想的…

【 buuctf--刷新过的图片】

前言&#xff1a;这题主要运用到了新的工具F5-steganography由于 java 环境不合适的原因&#xff0c;我不得不重新配java11.0.18。 具体思路&#xff1a;非常帅气的一张图片。。。用 binwalk&#xff0c;stegsolve&#xff0c;zsteg&#xff0c;exiftool 等工具无果后&#xf…

基于 Java 的小说阅读器小程序,附源码

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

如何在 Mac 上恢复永久删除的文件:有效方法

您是否错误地从 Mac 中删除了某个文件&#xff0c;并且确信它已经永远消失了&#xff1f;好吧&#xff0c;你可能错了。即使您认为已永久删除计算机上的数据&#xff0c;仍有可能将其恢复。 在本文中&#xff0c;您将了解如何在 Mac 上恢复永久删除的文件&#xff0c;并了解增…

【机器学习】数据清洗之处理缺失点

&#x1f388;个人主页&#xff1a;甜美的江 &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 &#x1f917;收录专栏&#xff1a;机器学习 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共同学习、交流进步…

代码随想录 Leetcode376. 摆动序列

题目&#xff1a; 代码&#xff08;首刷看解析 2024年2月9日&#xff09;&#xff1a; class Solution { public:int wiggleMaxLength(vector<int>& nums) {if (nums.size() < 1) return nums.size();int direction 0;//1上升&#xff0c;0下降int res 0;//res…

LeetCode Python - 5.最长回文子串

文章目录 题目答案运行结果 题目 给你一个字符串 s&#xff0c;找到 s 中最长的回文子串。 如果字符串的反序与原始字符串相同&#xff0c;则该字符串称为回文字符串。 示例 1&#xff1a; 输入&#xff1a;s “babad” 输出&#xff1a;“bab” 解释&#xff1a;“aba” 同…

那些 C语言指针 你不知道的小秘密 (4)

本篇会加入个人的所谓‘鱼式疯言’ ❤️❤️❤️鱼式疯言:❤️❤️❤️此疯言非彼疯言 而是理解过并总结出来通俗易懂的大白话, 我会尽可能的在每个概念后插入鱼式疯言,帮助大家理解的. &#x1f92d;&#x1f92d;&#x1f92d;可能说的不是那么严谨.但小编初心是能让更多人能…

寒假作业2024.2.8

1.现有文件test.c\test1.c\main.c,请编写Makefile Makefile文件&#xff1a; CCgcc EXEfile OBJS$(patsubst %.c,%.o,$(wildcard *.c)) CFLAGS-c -o all:$(EXE)file:test.o test1.o main.o$(CC) $^ -o $%.o:%.c$(CC) $(CFLAGS) $ $^.PHONY:clean clean:rm $(OBJS)main.c文件:…