归并排序(c语言代码实现)

 归并排序(稳定的排序):

归并排序是一种分治策略的排序算法,其基本思想是将待排序数组分成两个子数组,分别对这两个子数组进行排序,然后合并这两个已经排序好的子数组,最终得到完整的已排序数组。

具体实现过程如下:

  1. 将待排序数组从中心位置分成两个子数组,分别为左子数组和右子数组。
  2. 对左子数组和右子数组分别进行递归排序。
  3. 将排好序的左子数组和右子数组合并成一个有序数组。
  4. 重复执行步骤3,直到所有子数组都被合并成一个有序数组。

归并排序的时间复杂度为O(nlogn),空间复杂度为O(n)。它是一种稳定排序算法,适用于处理大规模数据的排序任务。

下面我们来看一下代码如何实现

首先是对数组划分

void mergesort(int a[],int low,int high)
{if (low < high){int mid = (low + high) / 2;//从中间划分两个子序列mergesort(a, low, mid);//对左侧子序列进行递归排序mergesort(a, mid + 1, high);//对右侧子序列进行递归排序merge(a, low, mid, high);//归并排序}
}

再进行归并

void merge(int a[], int low, int mid, int high)
{int* B = (int*)malloc(sizeof(int) * (high+ 1));//辅助数组Bint i = 0;int j = 0;int k = 0;for (k = low; k <= high; k++)B[k] = a[k];//将a中所有元素复制到B中for (i = low, j = mid + 1, k = i; i <= mid && j <= high; k++){if (B[i] <= B[j])//比较B中的左右两段中的元素a[k] = B[i++];//将较小值复制到a中elsea[k] = B[j++];}while (i <= mid)//若第一个表为检测完,一次复制到a中a[k++] = B[i++];while (j <= high)//若第二个表为检测完,一次复制到a中a[k++] = B[j++];
}

完整测试代码

#include<stdio.h>
#include<stdlib.h>
void merge(int a[], int low, int mid, int high)
{int* B = (int*)malloc(sizeof(int) * (high+ 1));//辅助数组Bint i = 0;int j = 0;int k = 0;for (k = low; k <= high; k++)B[k] = a[k];//将a中所有元素复制到B中for (i = low, j = mid + 1, k = i; i <= mid && j <= high; k++){if (B[i] <= B[j])//比较B中的左右两段中的元素a[k] = B[i++];//将较小值复制到a中elsea[k] = B[j++];}while (i <= mid)//若第一个表为检测完,一次复制到a中a[k++] = B[i++];while (j <= high)//若第二个表为检测完,一次复制到a中a[k++] = B[j++];
}
void mergesort(int a[],int low,int high)
{if (low < high){int mid = (low + high) / 2;//从中间划分两个子序列mergesort(a, low, mid);//对左侧子序列进行递归排序mergesort(a, mid + 1, high);//对右侧子序列进行递归排序merge(a, low, mid, high);//归并排序}
}
int main()
{int a[] = { 49,38,65,97,76,13,27 };int sz = sizeof(a) / sizeof(a[0]);int j = 0;printf("原始待排序的数组为:");for(j = 0; j < sz; j++)printf("%d ", a[j]);mergesort(a,0,sz-1);printf("\n归并排序后的数组为:");for (j = 0; j < sz; j++)printf("%d ", a[j]);return 0;
}

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

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

相关文章

Sentinel黑白名单授权规则解读

目录 基本介绍 代码实战 架构说明 RequestOriginParser的实现类 网关添加请求头 配置授权规则 基本介绍 授权规则可以对请求方来源做判断和控制。 很多时候&#xff0c;我们需要根据调用来源来判断该次请求是否允许放行&#xff0c;这时候可以使用 Sentinel 的来源…

C#学习相关系列之常用符号介绍

一、>符号的用法 >用法主要有两种&#xff0c;第一种是Lambda表达式&#xff0c;第二种是用于赋值&#xff1b; 第一种lambda用法&#xff1a; // 声明一个函数指针的对象, 也就是委托, 其函数签名为string f(Person) Func<Person, string> nameProjection p &…

酒水展示预约小程序的效果如何

酒的需求度非常高&#xff0c;各种品牌、海量经销商组成了庞大市场&#xff0c;而在实际经营中&#xff0c;酒水品牌、经销商、门店经营者等环节往往也面临着品牌传播拓客引流难、产品展示预约订购难、营销难、销售渠道单一等痛点。 那么商家们应该怎样解决呢&#xff1f; 可以…

31.Map集合用法、遍历、排序与常见API

概要&#xff1a; java.util 中的集合类包含 Java 中某些最常用的类。最常用的集合类是 List 和 Map。 Map 提供了一个更通用的元素存储方法。Map 集合类用于存储元素对&#xff08;称作“键”和“值”&#xff09;&#xff0c;其中每个键映射到一个值。 本文主要介绍java ma…

如何使用VSCode来查看二进制文件

2023年11月6日&#xff0c;周一下午 目录 方法1&#xff1a;安装插件Binary Viewer然后用vscode打开一个二进制文件&#xff0c;并点击右上角的"HEX"方法2&#xff1a;安装插件Binary然后用vscode打开一个二进制文件&#xff0c;并点击右上角的"B" 方法1&…

C-DS二叉树_另一棵树的子树

Description 给你两棵二叉树tree1和tree2,检验tree1中是否包含和tree2具有相同结构和结点值的子树。如果存在,输出true;否则,输出false。 Input 第一行输入t,表示有t个测试样例。 第二行首先输入n1,接着输入n1个整数,表示二叉树tree1。 第三行首先输入n2,接着输入n…

Vite 的基本原理,和 webpack 在开发阶段的比较

目录 1&#xff0c;webpack 的流程2&#xff0c;Vite 的流程简单编译 3&#xff0c;总结 主要对比开发阶段。 1&#xff0c;webpack 的流程 开发阶段大致流程&#xff1a;指定一个入口文件&#xff0c;对相关的模块&#xff08;js css img 等&#xff09;先进行打包&#xff0…

【Unity基础】7.动画状态参数

【Unity基础】7.动画状态参数 大家好&#xff0c;我是Lampard~~ 欢迎来到Unity基础系列博客&#xff0c;所学知识来自B站阿发老师~感谢 &#xff08;一&#xff09;创建动画状态 (1) 创建动画状态 不好意思各位~最近工作比较忙&#xff0c;稍微耽误了这两周的博客。话…

Hydra post登录框爆破

文章目录 无token时的Hydra post登录框爆破带Token时的Hydra post登录框爆破 无token时的Hydra post登录框爆破 登录一个无验证码和token的页面&#xff0c;同时抓包拦截 取出发送数据包&#xff1a;usernameadb&password133&submitLogin 将用户名和密码替换 userna…

项目部署文档

申请SSL证书 先申请,用免费的 下载证书 先将下载下来的保存起来 服务器安装JDK: 创建develop目录 mkdir /usr/local/develop/ 把JDK压缩包上传到/usr/local/develop/目录 解压安装包 并且将安装到指定目录 tar -zxvf /usr/local/develop/jdk-8u191-linux-x64.tar.gz -C /us…

传感与表面分析

传感技术同计算机技术与通信一起被称为信息技术的三大支柱。从物联网角度看&#xff0c;传感技术是衡量一个国家信息化程度的重要标志&#xff0c;作为第二届杭州物联网暨传感技术应用高峰论坛&#xff0c;推进我国传感器产业化快速发展。传感技术是关于从自然信源获取信息&…

【tcl 脚本学习-- tcl 脚本常用命令介绍】

文章目录 TCL在Linux下如何执行TCL 常用语法TCL 中括号和大括号和小括号的详细介绍TCL Catch 命令介绍TCL 中 eval 详细介绍 TCL&#xff08;Tool Command Language&#xff09;是一种动态编程语言&#xff0c;通常用于嵌入到应用程序中以提供脚本功能&#xff0c;或者用于测试…

CMake重要指令常用变量

什么是CMake? 没有使用CMake和使用CMake构建的区别&#xff1f; CMake的基本语法 语法格式&#xff1a; 指令(参数1 参数2...)赋值操作 如 把hello.cpp 赋值给变量HELLO set(HELLO hello.cpp)取变量的值&#xff1a; ${HELLO}但在if控制语句中是直接使用变量名。 if(HEL…

lazarus:数据集快速导出为excel、csv、sql及其他多种格式

lazarus被成为快速开发工具&#xff0c;为什么说“快速”&#xff0c;重要的一点是&#xff0c;很多工具是现成的&#xff0c;可以拿来直接就用。比如数据导出&#xff0c;如果需要把数据集导出为excel格式文件&#xff0c;写代码可能需要很多时间。lazarus就不用了&#xff0c…

Java连接Redis并操作Redis中的常见数据类型

目录 一. Java连接Redis 1. 导入依赖 2. 建立连接 二. Java操作Redis的常见数据类型存储 1. Redis字符串(String) 2. Redis哈希(Hash) 3. Redis列表&#xff08;List&#xff09; 4. Redis集合&#xff08;Set&#xff09; 一. Java连接Redis 1. 导入依赖 pom依赖…

外汇天眼:全员免费,赢奖金!

外汇市场一直以来都是金融投资者的热门领域之一&#xff0c;但对于新手来说&#xff0c;了解和掌握外汇交易可能需要时间和经验。为了帮助新手入门&#xff0c;提高交易技能&#xff0c;外汇模拟交易应运而生。为的是能够零风险无压力地帮助外汇投资者更好地掌握外汇交易的技巧…

【GEE】4、 Google 地球引擎中的数据导入和导出

1简介 在本模块中&#xff0c;我们将讨论以下概念&#xff1a; 如何将您自己的数据集引入 GEE。如何将来自遥感数据的值与您自己的数据相关联。如何从 GEE 导出特征。 2背景 了解动物对环境的反应对于了解如何管理这些物种至关重要。虽然动物被迫做出选择以满足其基本需求&am…

JWT登录校验

工作原理 下面来详细看看 UTF-8 是如何工作的&#xff0c;以及为什么它会根据被编码的字符具有不同的长度。 一、JWT是什么&#xff1f; 在介绍JWT之前&#xff0c;我们先来回顾一下利用token进行用户身份验证的流程&#xff1a; 1、客户端使用用户名和密码请求登录 2、服务端…

Etcd 解析

Etcd 解析 Etcd 是 Kubernetes 集群中的一个十分重要的组件,用于保存集群所有的网络配置和对象的状态信息。在后面具体的安装环境中,我们安装的 etcd 的版本是 v3.1.5,整个 Kubernetes 系统中一共有两个服务需要用到 etcd 用来协同和存储配置,分别是: 网络插件 flannel、…

STM32中微秒延时的实现方式

STM32中微秒延时的实现方式 0.前言一、裸机实现方式二、FreeRTOS实现方式三、定时器实现&#xff08;通用&#xff09;4、总结 0.前言 最近在STM32驱动移植过程中需要用到微秒延时来实现一些外设的时序&#xff0c;由于网上找到的驱动方法良莠不齐&#xff0c;笔者在实现时序过…