排序算法之 归并排序及时间复杂度分析

2023-10-27

归并排序

归并排序是建立在归并操作上的一种有效排序算法,该算法是采用分治法的一个典型应用。
这里的分治如何理解?
比如我们要统计本县城的高考状元,而一个县城中有很多中学,每个中学又有若干个班级,每个班级有若干名学生,每个学生是一个单独个体,看成数组中的一个元素。接下来,班级内学生两两组合并排好序组成一组,然后两组两组再进行合并并排好序…各班级分别排好序…各学校分别排好序…县中所有学生排序…

归并排序基本思想:

  1. 将序列中待排序数分为若干组,每个数字为一组
  2. 将若干个组进行两两合并,保证合并后的组是有序的
  3. 一直重复第二步操作直到剩下一组,排序完成

效果图:
在这里插入图片描述
在这里插入图片描述

算法实现
#include <stdio.h>

int arr1[10] = {9,8,7,6,5,4,3,2,1,0}, arr2[10];//原数组arr1,临时空间数组arr2
void merge(int low, int mid, int high) {
	int i = low, j = mid + 1, k = low;
	while (i <= mid && j <= high)
		if (arr1[i]<arr1[j])
			arr2[k++] = arr1[i++];
		else
			arr2[k++] = arr1[j++];
	while (i <= mid)
		arr2[k++] = arr1[i++];
	while (j <= high)
		arr2[k++] = arr1[j++];
	for (i = low; i <= high; i++) {
		arr1[i] = arr2[i];
	}
}

void mergeSort(int a, int b) {
	//直到a=b时,停止递归。
	if (a<b) {
		int mid = (a + b) / 2;
		mergeSort(a, mid);
		mergeSort(mid + 1, b);
		merge(a, mid, b);
	}
}

int main() {
	int i;
    mergeSort(0, 9);
	return 0;
}


时间复杂度

归并排序的效率是比较高的,设数列长为N,将数列分开成小数列一共要logN步,每步都是一个合并有序数列的过程,时间复杂度可以记为O(N),故一共为O(NlogN)。因为归并排序每次都是在相邻的数据中进行操作,所以归并排序在O(NlogN)的几种排序方法(快速排序,归并排序,希尔排序,堆排序)也是效率比较高的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

排序算法之 归并排序及时间复杂度分析 的相关文章

随机推荐

  • 使用JDBC连接数据库(一)

    JDBC是由java编程语言编写的类及接口组成 同时它为程序开发人员提供了一组用于实现对数据库访问的JDBC API 并支持SQL语言 利用JDBC可以将JAVA代码连接到oracle DB2 SQLServer MYSQL等数据库 从而实
  • 线程池的实现原理、并发和并行

    线程池参数详解 https blog csdn net daiqinge article details 51179445 例题 比如现在设置coreSize 5 maxSize 10 blockQueueSize 10 依次提交6个比较耗
  • 矩阵的转置,逆矩阵,行列式的计算,伴随矩阵等

    行列式的操作 逆矩阵 就是两个矩阵相乘是单位矩阵 对角矩阵相乘 就是对角线元素相乘 当两个矩阵相乘不是单位矩阵 伴随矩阵 是有代数余子式拼成的 为什么伴随矩阵会出现 为什么伴随矩阵的形式是这样的 因为行列式的乘法 根据矩阵的乘法可以看到 行
  • java中静态方法中调用非静态方法的详解

    静态static方法中不能调用非静态 non static 方法 准确地说是不能直接调用non static方法 但是可以通过将一个对象的引用传入static方法中 再去调用该对象的non static方法 其实这个事实的应用很经常 以至于
  • ConcurrentHashMap原理,jdk7和jdk8版本的区别

    ConcurrentHashMap原理 jdk7和jdk8版本的区别 jdk7 数据结构 ReentrantLock Segment HashEntry 一个Segment中包含一个类似于HashMap的结构 数组 链表 元素查询 二次ha
  • Linux 系统适用范围

    Linux 内核最初只是由芬兰人林纳斯 托瓦兹 Linus Torvalds 在赫尔辛基大学上学时出于个人爱好而编写的 Linux 是一套免费使用和自由传播的类 Unix 操作系统 是一个基于 POSIX 和 UNIX 的多用户 多任务 支
  • 按月、日统计查询数据SQL、以及case when的使用 -- postgresql、MySQL

    目录 获取每月最新一条数据及case when的使用 以及其他 数据类型转换 分页 等使用 postgresql 根据月份分组 创建时间排序 获取排序后的第一条数据 即获取每月最新一条数据 postgresql 查询显示当前月往前12个月份
  • PHP生成word文档

  • 如何进行Linux系统管理和维护?

    首先 让我们先了解一下Linux系统管理的重要性 在现实世界中 Linux系统管理就像是掌握一门外语 如果你想在一个外国城市旅游时和当地人交流 你需要掌握一些基本的语言知识 同样地 如果你想管理好一个Linux系统 你需要掌握一些基本的系统
  • ThinkPHP5.1获取有赞推送信息

    Index php
  • 1.4编程基础之逻辑表达式与条件分支 01:判断数正负

    1 4编程基础之逻辑表达式与条件分支 01 判断数正负 总时间限制 1000ms 内存限制 65536kB 描述 给定一个整数N 判断其正负 输入 一个整数N 109 lt N lt 109 输出 如果N gt 0 输出positive 如
  • 202311读书笔记

    202311读书笔记 始于极限 女性主义往复书简 读书是为了看到从未了解过的世界 始于极限 女性主义往复书简 作者上野千鹤子 铃木凉美 在小伙伴的读书群里看到的这本书 女性必读自我认知的书 涉及恋爱 婚姻 工作 自由等12个主题 啊啊啊 这
  • SQL SERVER导入mdf和ldf文件最简便的方法

    有时候我们需要导入mdf和ldf文件进入SQL SERVER中 现在我介绍一种只要三行代码就能导入的方法 一 找到一个现有数据库右键点击 新建查询 二 加入如下代码 EXEC sp attach db dbname 一个新的数据库名字 fi
  • Java 数组

    Java 数组 定义 1 数组是个容器 堆中的一块空间 需要在堆中开辟一块空间new 2 数组可以同时存储同一类数据的多个数据 a 多个数据 b 同一类型 特点 1 可以存储多个数据 但只能是同一类型 2 数组创建完成后数组长度无法改变 3
  • MySQL安装_win10(超详细)

    前言 解压版 免安装版 mysql 8 0 22 一 MySQL下载 解压 MySQL官网下载地址 https downloads mysql com archives community 英文版 中文版 下载完成如图所示 解压后如图所示
  • IDEA编写快捷生成代码

    1 psvm 生成main方法 public static void main String args 2 sout 生成打印输出 System out println 3 abc sout 生成打印字符串 System out print
  • Kotlin中接口、抽象类、泛型、out(协变)、in(逆变)、reified关键字的详解

    博主前些天发现了一个巨牛的人工智能学习网站 通俗易懂 风趣幽默 忍不住也分享一下给大家 点击跳转到教程 一 Kotlin中接口的定义 Kotlin中接口定义 Kotlin规定所有的接口属性和函数实现都要使用override关键字 接口中 定
  • css实现透明背景渐变 linear-gradient

    css实现透明背景渐变 linear gradient html div class curtain div css curtain before display block width 100 height 32px background
  • MES案例整理

    以下内容全部从互联网收集得来 有些可能虽然是厂商的用户但不是MES的用户 有些可能并不能称为MES案例 仅供大家参考 欢迎大家修正和补充 如要转载 请注明来源于e works圆目球鱼的博客 以下排名不分先后 西门子 转载请注明出自http
  • 排序算法之 归并排序及时间复杂度分析

    排序算法之 冒泡排序及性能优化 时间复杂度 空间复杂度分析 排序算法之 简单选择排序及时间复杂度分析 排序算法之 直接插入排序及时间复杂度分析 排序算法之 希尔排序及时间复杂度分析 排序算法之 快速排序及时间复杂度分析 排序算法之 堆排序及