当前位置: 首页 > news >正文

查找与排序-归并排序

排序算法可以分为内部排序和外部排序,

内部排序是数据记录在内存中进行排序,

外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存

常见的内部排序算法有:插入排序、希尔排序、选择排序、冒泡排序、归并排序、快速排序、堆排序、基数排序等。用一张图概括:

归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。代价是需要额外的内存空间。若将两个有序表合并成一个有序表,称为2-路归并。 该算法时间复杂度为O(n log n)。

算法的原理如下:

  1. 将待排序的线性表不断地切分成若干个子表,直到每个子表只包含一个元素,这时,可以认为只包含一个元素的子表是有序表。
  2. 将子表两两合并,每合并一次,就会产生一个新的且更长的有序表,重复这一步骤,直到最后只剩下一个子表,这个子表就是排好序的线性表。

假设我们有一个初始数列为{8, 4, 5, 7, 1, 3, 6, 2},整个归并排序的过程如下图所示。

算法性能

速度仅次于快速排序。

时间复杂度

O(nlogn)

空间复杂度

O(N),归并排序需要一个与原数组相同长度的数组做辅助来排序。

稳定性

稳定

// 归并排序
void MergeSort(int arr[], int start, int end, int * temp) // start和end分别是左边界和右边界
{if (start >= end)return;int mid = (start + end) / 2;MergeSort(arr, start, mid, temp);MergeSort(arr, mid + 1, end, temp);// 合并两个有序序列int length = 0; // 表示辅助空间有多少个元素int i_start = start;int i_end = mid;int j_start = mid + 1;int j_end = end;while (i_start <= i_end && j_start <= j_end){if (arr[i_start] < arr[j_start]){temp[length] = arr[i_start]; length++;i_start++;}else{temp[length] = arr[j_start];length++;j_start++;}}while (i_start <= i_end)  // 把剩下数的合并{temp[length] = arr[i_start];i_start++;length++;}while (j_start <= j_end){temp[length] = arr[j_start];length++;j_start++;}// 把辅助空间的数据放到原空间for (int i = 0; i < length; i++){arr[start + i] = temp[i];}
}

http://www.mrgr.cn/news/41533.html

相关文章:

  • 什么是大语言模型的大海捞针指标
  • 2024/10/2 408 20题
  • 将给定的表达式树(二叉树)转换为等价的中缀表达式(通过括号反映操作符的计算次序)并输出
  • 【重学 MySQL】五十二、MySQL8 新特性:计算列
  • 官方外卖霸王餐对接接口渠道如何选择?
  • wsl(4) -- 编译驱动模块
  • 【FPGA开发】Xilinx FPGA差分输入时钟的使用方法
  • 10月2日笔记(内网资源探测篇)
  • 鸢尾花书实践和知识记录[数学要素3-3几何]
  • 系统安全 - Linux 安全模型及实践
  • AI通用大模型编程需要的能力
  • 《重生到现代之从零开始的C语言生活》—— 内存函数
  • 【GESP】C++一级练习BCQM3021,输入-计算-输出-2
  • Python(三)——列表
  • JavaScript for循环语句
  • npm包管理深度探索:从基础到进阶全面教程!
  • UniVue大版本更新:UniVue2.0.0-preview
  • 枫叶MTS格式转换器- 强大、操作简单的MTS、M2TS视频转换工具供大家学习研究参考
  • 老年人最真实的养老需求
  • 【GESP】C++一级练习BCQM3022,输入-计算-输出-3