归并排序简介【算法 11】

2024-08-29 09:04
文章标签 算法 归并 排序 简介

本文主要是介绍归并排序简介【算法 11】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

归并排序简介

归并排序(Merge Sort)是一种有效的、稳定的、基于分治法的排序算法。它的核心思想是将数组分成更小的部分,分别进行排序后再合并。归并排序具有 (O(n \log n)) 的时间复杂度,在处理大规模数据时表现优异。
请添加图片描述


算法原理

归并排序的工作原理基于“分治法”(Divide and Conquer),即:

  1. 分解(Divide):将未排序的数组一分为二,直到每个子数组仅包含一个元素。
  2. 合并(Conquer):将两个有序的子数组合并成一个有序数组。

具体步骤如下:

  1. 将数组从中间划分为两个子数组。
  2. 对两个子数组分别进行归并排序。
  3. 合并两个有序的子数组。

归并过程详解

合并两个有序数组的步骤如下:

  1. 创建一个临时数组 temp,用于存储合并后的数组。
  2. 使用两个指针分别指向两个子数组的起始位置,比较这两个位置上的元素,将较小的元素放入 temp,指针后移。
  3. 重复上述操作,直到某一个子数组遍历完成。
  4. 将未遍历完的子数组剩余元素直接放入 temp

算法实现

以下是 C 语言中归并排序的实现代码:

#include <stdio.h>// 合并两个有序数组
void merge(int arr[], int left, int mid, int right) {int n1 = mid - left + 1;int n2 = right - mid;int leftArr[n1], rightArr[n2];// 分别拷贝左右子数组for (int i = 0; i < n1; i++)leftArr[i] = arr[left + i];for (int j = 0; j < n2; j++)rightArr[j] = arr[mid + 1 + j];int i = 0, j = 0, k = left;// 合并两个有序数组while (i < n1 && j < n2) {if (leftArr[i] <= rightArr[j]) {arr[k] = leftArr[i];i++;} else {arr[k] = rightArr[j];j++;}k++;}// 将剩余元素放入原数组while (i < n1) {arr[k] = leftArr[i];i++;k++;}while (j < n2) {arr[k] = rightArr[j];j++;k++;}
}// 递归调用归并排序
void mergeSort(int arr[], int left, int right) {if (left < right) {int mid = left + (right - left) / 2;// 递归调用左半部分和右半部分mergeSort(arr, left, mid);mergeSort(arr, mid + 1, right);// 合并两个排序后的数组merge(arr, left, mid, right);}
}// 打印数组
void printArray(int arr[], int size) {for (int i = 0; i < size; i++)printf("%d ", arr[i]);printf("\n");
}int main() {int arr[] = {12, 11, 13, 5, 6, 7};int arr_size = sizeof(arr)/sizeof(arr[0]);printf("Given array is \n");printArray(arr, arr_size);mergeSort(arr, 0, arr_size - 1);printf("\nSorted array is \n");printArray(arr, arr_size);return 0;
}

复杂度分析

  • 时间复杂度:归并排序的时间复杂度为 (O(n \log n)),其中 (n) 是数组的元素个数。由于每次都将数组分成两部分,而每次合并操作的时间是线性的,因此总的时间复杂度是对数级别的。

  • 空间复杂度:归并排序需要额外的空间来存储临时数组,空间复杂度为 (O(n))。

归并排序的优点与缺点

优点:
  1. 稳定性:归并排序是一种稳定的排序算法,能保证相等元素的相对顺序不变。
  2. 时间复杂度较低:即使在最坏情况下,归并排序的时间复杂度依然是 (O(n \log n)),表现稳定。
缺点:
  1. 空间复杂度较高:由于归并排序需要额外的临时存储空间,空间消耗较大。
  2. 不适合小规模数据:对于数据规模较小的数组,归并排序相比于插入排序等更高效的排序算法不具优势。

结论

归并排序在处理大规模数据时非常高效,适合需要稳定排序的场景。尽管其空间复杂度较高,但其时间复杂度较低且性能稳定,在很多实际应用中具有广泛的应用前景。

这篇关于归并排序简介【算法 11】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1117432

相关文章

Spring Security简介、使用与最佳实践

《SpringSecurity简介、使用与最佳实践》SpringSecurity是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架,本文给大家介绍SpringSec... 目录一、如何理解 Spring Security?—— 核心思想二、如何在 Java 项目中使用?——

Java Stream 并行流简介、使用与注意事项小结

《JavaStream并行流简介、使用与注意事项小结》Java8并行流基于StreamAPI,利用多核CPU提升计算密集型任务效率,但需注意线程安全、顺序不确定及线程池管理,可通过自定义线程池与C... 目录1. 并行流简介​特点:​2. 并行流的简单使用​示例:并行流的基本使用​3. 配合自定义线程池​示

PostgreSQL简介及实战应用

《PostgreSQL简介及实战应用》PostgreSQL是一种功能强大的开源关系型数据库管理系统,以其稳定性、高性能、扩展性和复杂查询能力在众多项目中得到广泛应用,本文将从基础概念讲起,逐步深入到高... 目录前言1. PostgreSQL基础1.1 PostgreSQL简介1.2 基础语法1.3 数据库

Python库 Django 的简介、安装、用法入门教程

《Python库Django的简介、安装、用法入门教程》Django是Python最流行的Web框架之一,它帮助开发者快速、高效地构建功能强大的Web应用程序,接下来我们将从简介、安装到用法详解,... 目录一、Django 简介 二、Django 的安装教程 1. 创建虚拟环境2. 安装Django三、创

C++归并排序代码实现示例代码

《C++归并排序代码实现示例代码》归并排序将待排序数组分成两个子数组,分别对这两个子数组进行排序,然后将排序好的子数组合并,得到排序后的数组,:本文主要介绍C++归并排序代码实现的相关资料,需要的... 目录1 算法核心思想2 代码实现3 算法时间复杂度1 算法核心思想归并排序是一种高效的排序方式,需要用

MySQL 索引简介及常见的索引类型有哪些

《MySQL索引简介及常见的索引类型有哪些》MySQL索引是加速数据检索的特殊结构,用于存储列值与位置信息,常见的索引类型包括:主键索引、唯一索引、普通索引、复合索引、全文索引和空间索引等,本文介绍... 目录什么是 mysql 的索引?常见的索引类型有哪些?总结性回答详细解释1. MySQL 索引的概念2

Qt QCustomPlot库简介(最新推荐)

《QtQCustomPlot库简介(最新推荐)》QCustomPlot是一款基于Qt的高性能C++绘图库,专为二维数据可视化设计,它具有轻量级、实时处理百万级数据和多图层支持等特点,适用于科学计算、... 目录核心特性概览核心组件解析1.绘图核心 (QCustomPlot类)2.数据容器 (QCPDataC

Java中的雪花算法Snowflake解析与实践技巧

《Java中的雪花算法Snowflake解析与实践技巧》本文解析了雪花算法的原理、Java实现及生产实践,涵盖ID结构、位运算技巧、时钟回拨处理、WorkerId分配等关键点,并探讨了百度UidGen... 目录一、雪花算法核心原理1.1 算法起源1.2 ID结构详解1.3 核心特性二、Java实现解析2.

一文详解Java Stream的sorted自定义排序

《一文详解JavaStream的sorted自定义排序》Javastream中的sorted方法是用于对流中的元素进行排序的方法,它可以接受一个comparator参数,用于指定排序规则,sorte... 目录一、sorted 操作的基础原理二、自定义排序的实现方式1. Comparator 接口的 Lam

Java List排序实例代码详解

《JavaList排序实例代码详解》:本文主要介绍JavaList排序的相关资料,Java排序方法包括自然排序、自定义排序、Lambda简化及多条件排序,实现灵活且代码简洁,文中通过代码介绍的... 目录一、自然排序二、自定义排序规则三、使用 Lambda 表达式简化 Comparator四、多条件排序五、