首页 > 其他分享 >归并排序

归并排序

时间:2024-09-22 23:13:12浏览次数:8  
标签:归并 数组 int merge 有序 排序

选择排序

. . . . . .

定义

归并排序(merge sort)是高效的基于比较的稳定排序算法。

性质

归并排序基于分治思想将数组分段排序后合并,时间复杂度在最优、最坏与平均情况下均为 O(n log n),空间复杂度为 O(n)。

归并排序可以只使用 O(1) 的辅助空间,但为便捷通常使用与原数组等长的辅助数组。

过程

归并排序最核心的部分是合并(merge)过程:将两个有序的数组 a[i] 和 b[j] 合并为一个有序数组 c[k]。

从左往右枚举 a[i] 和 b[j],找出最小的值并放入数组 c[k];重复上述过程直到 a[i] 和 b[j] 有一个为空时,将另一个数组剩下的元素放入 c[k]。

为保证排序的稳定性,前段首元素小于或等于后段首元素时(a[i] <= b[j])而非小于时(a[i] < b[j])就要作为最小值放入 c[k]。

分治法实现归并排序

1.当数组长度为 1 时,该数组就已经是有序的,不用再分解。

2.当数组长度大于 1 时,该数组很可能不是有序的。此时将该数组分为两段,再分别检查两个数组是否有序(用第 1 条)。如果有序,则将它们合并为一个有序数组;否则对不有序的数组重复第 2 条,再合并。

用数学归纳法可以证明该流程可以将一个数组转变为有序数组。

为保证排序的复杂度,通常将数组分为尽量等长的两段(mid = l + r >> 1)。

代码实现

#include <bits/stdc++.h>
using namespace std;
int n,a[100010];
int tmp[100010];
void merge_sort(int l, int r)
{
	if (l >= r) return;
	
	int mid = l + r >> 1;
	merge_sort(l, mid);
	merge_sort(mid + 1, r);
	
	int k = 0,i = l,j = mid + 1;
	while (i <= mid && j <= r)
		if (a[i] <= a[j]) tmp[k++] = a[i++];
	else tmp[k++] = a[j++];
	
	while (i <= mid) tmp[k++] = a[i++];
	while (j <= r) tmp[k++] = a[j++];
	
	for (i = l,j = 0;i <= r;i++,j++) a[i] = tmp[j];
}
int main()
{
	int n;
	cin >> n;
	for(int i = 1;i <= n;i++)
	{
		cin >> a[i];
	}
	merge_sort(1,n);
	for(int i = 1;i <= n;i++)
	{
		cout << a[i] << " ";
	}
	return 0;
}

. . . . . .

标签:归并,数组,int,merge,有序,排序
From: https://www.cnblogs.com/Domi2011/p/18426082

相关文章

  • 选择排序
    选择排序......定义选择排序(Selectionsort)是一种简单直观的排序算法。它的工作原理是每次找出第i小的元素(也就是A{i..n}中最小的元素),然后将这个元素与数组第i个位置上的元素交换。稳定性由于swap(交换两个元素)操作的存在,选择排序是一种不稳定的排序算法。时间复......
  • 冒泡排序
    冒泡排序......定义冒泡排序(Bubblesort)是一种简单的排序算法。由于在算法的执行过程中,较小的元素像是气泡般慢慢「浮」到数列的顶端,故叫做冒泡排序。过程它的工作原理是每次检查相邻两个元素,如果前面的元素与后面的元素满足给定的排序条件,就将相邻两个元素交换。当没有......
  • 数据结构之线性表——LeetCode:82. 删除排序链表中的重复元素 II,21. 合并两个有序链
    82.删除排序链表中的重复元素II题目描述82.删除排序链表中的重复元素II给定一个已排序的链表的头 head , 删除原始链表中所有重复数字的节点,只留下不同的数字 。返回 已排序的链表 。运行代码classSolution{public:ListNode*deleteDuplicates(ListNode......
  • Java-数据结构-排序-(二) (๑¯∀¯๑)
    文本目录:❄️一、交换排序:    ➷ 1、冒泡排序:    ▶代码:     ➷ 2、快速排序:          ☞基本思想:          ☞方法一:Hoare法    ▶代码:           ☞方法二:挖坑法  ......
  • 冒泡排序
    publicclassArraysDemo01{publicstaticvoidmain(String[]args){//冒泡排序//比较数组中,两个相邻的元素,如果第一个比第二个数大,调换位置//每一次比较,都会产生一个最大或者最小的数//下一轮可以少一次排序intar[]={1,212,6,9,12,88,2,22};System.out.println(Arrays......
  • 冒泡排序、选择排序、插入排序 - JavaScript 中的数据结构和算法
    排序算法是许多计算任务的支柱,在组织数据以实现高效访问和处理方面发挥着至关重要的作用。无论您是刚刚开始探索算法世界的初学者,还是希望刷新知识的经验丰富的开发人员,了解这些基本排序技术都是至关重要的。在这篇文章中,我们将探讨一些更基本的排序算法-冒泡排序、选择排序和插......
  • 稳定排序算法
    一、什么是不稳定性算法?具有相同关键字的纪录经过排序后, 相对位置发生改变, 这样的算法是不稳定性算法。一、不稳定排序算法有哪些1、堆排序2、希尔排序3、快速排序4、选择排序口诀:一堆(堆)希尔(希尔)快(快速)选(选择)二、常见排序算法稳定性分析1、堆排序堆的结构是节点i的孩子为2*i......
  • 前端五种排序
    1.冒泡排序(BubbleSort)冒泡排序是一种简单的排序算法,它重复地遍历待排序的数组,比较相邻元素并交换顺序错误的元素。每次遍历后,最大的元素“冒泡”到数组的末尾。functionbubbleSort(arr){ constlen=arr.length; for(leti=0;i<len-1;i++){ for(letj=0;......
  • 排序 我觉得有点难 要常来看
    packageSort;importjava.util.Stack;publicclassSort{/**插入排序*时间复杂度:*最好情况:数据完全有序的时候12345:O(N)*最坏情况:数据完全逆序的时候54321:O(N^2)*结论:当给出的数据越有序排列越快......
  • c# 笔记 winform添加右键菜单,获取文件大小 ,多条件排序OrderBy、ThenBy,list<double>截取
    Winform右键菜单‌要在C#Winform应用程序中添加右键菜单,‌你可以按照以下步骤操作:‌1.‌创建菜单项‌在Form的构造函数或加载事件中,‌创建ContextMenuStrip控件的实例,‌并为其添加菜单项。‌2.‌绑定到控件‌将ContextMenuStrip控件绑定到需要显示右键菜单的控件上,‌如Panel......