首页 > 其他分享 >数据结构6.4——归并排序

数据结构6.4——归并排序

时间:2024-12-10 10:57:58浏览次数:6  
标签:tmp 归并 数据结构 int begin 6.4 数组 排序

基本思想:

归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用分治法的一个非常典型的应用。将已有的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为,称为二路归并。

核心思想:

将两个已经排好序的数组,合成一个排好序的数组

如果:一个数组只有一个元素,那么这个数组一定是有序的

问题:

  1. 我们该如何把一个乱序的数组,分为全是只有一个元素的数组?(答案:递归)
  2. 我们又该如何把多个只有一个元素的数组合并成一个有序的数组?

代码演示:

void MergeSort(int* a, int n)
{
	int* tmp = (int*)malloc(sizeof(int) * n);
	if (tmp == NULL)
	{
		perror("malloc::fail");
		return;
	}

	_MergeSort(a, 0, n - 1, tmp);
}

void _MergeSort(int* a, int begin, int end, int* tmp)
{
    if(begin>=end)//当只有一个元素排序时候就停止了,毕竟数组只有一个元素就相当于排好序了
    return;

	int mid = (begin + end) / 2;
	_MergeSort(a, begin, mid, tmp);//递归的目的是把数组打散
	_MergeSort(a, mid+1, end, tmp);

	int begin1 = begin, end1 = mid;//将两个排好序的数组,变成一个排序序的数组
	int begin2 = mid + 1, end2 = end;
	int i = begin;
	while (begin1 <= end1 && begin2 <= end2)
	{
		if (a[begin1] < a[begin2])
		{
			tmp[i++] = a[begin1++];
		}
		else
		{
			tmp[i++] = a[begin2];
		}
	}
	while (begin1 <= end1)//当其中的一个数组走完,但另一个数组没走完,就把剩下的数组的数据插入就行
	{
		tmp[i++] = a[begin1++];
	}
	while (begin2 <= end2)
	{
		tmp[i++] = a[begin2++];
	}

	memcpy(a + begin, tmp + begin, sizeof(int) * (end - begin - 1));
}

归并排序的特性总结:

  1. 归并的缺点在于需要O(N)的空间复杂度,归并排序的思想更多的是解决再磁盘中的外排序问题
  2. 时间复杂度:O(NlogN)
  3. 空间复杂度:O(N)
  4. 稳定性:稳定

标签:tmp,归并,数据结构,int,begin,6.4,数组,排序
From: https://blog.csdn.net/2301_78702440/article/details/144341458

相关文章

  • Python知识分享第二十一天-数据结构入门
    数据结构“”"基础概念:程序=数据结构+算法数据结构=存储和组织数据的方式.算法=解决问题的思维,思路,方式.算法的特性:独立性:算法=思维,是解决问题的思路和方式,不依赖语言.5大特性:有输入,有输出,有穷性,确定性,可行性.问:如何衡......
  • 【数据结构——栈和队列】括号配对(头歌实践教学平台习题)【合集】
    目录......
  • 【数据结构】 堆(二叉堆)详解
    定义:堆的底层数据结构是树,一般不引起歧义的情况下,堆指的是二叉堆,其底层数据结构是完全二叉树,堆分为大根堆和小根堆,大根堆的每个节点的父亲都大于当前节点,小根堆反之,本文以小根堆为例二叉堆插入思路:将要插入的树放在数组最后,令数组原来的大小为\(size\),堆数组的名为\(heap\)......
  • 数据结构--排序
    排序是计算机科学与技术领域中的一项基本操作,旨在将一组数据按某种顺序排列。以下是几种常见排序算法的具体解释:一、冒泡排序(BubbleSort)工作原理冒泡排序算法的工作原理如下:比较相邻的元素。如果第一个比第二个大(对于升序排序,如果是降序则相反),就交换它们两个。对每一对......
  • 数组中的逆序对:基于归并排序的高效解法
    问题背景在算法和数据结构领域,"逆序对"是一个经典的计算问题。逆序对定义为数组中前面的元素大于后面的元素的数对。例如,在序列[7,5,6,4]中,存在的逆序对包括:(7,5)(7,6)(7,4)(5,4)(6,4)问题分析问题要求给定一个整数数组,要求计算数组中所有逆序对的总数。暴力解法的局......
  • 数据结构实验8
    1#include<iostream>2#include<string>3usingnamespacestd;4#defineMax_size10056voidselectSort(int*arr,intn)//简单选择排序7{8inti,j,k,temp;9for(i=0;i<n;i++){10k=i;11for(j......
  • 求解赫夫曼编码的算法 数据结构算法6.12、6.13
    一.问题描述定义赫夫曼树和赫夫曼编码的存储结构,并写出求解赫夫曼编码的算法。二.问题分析1.赫夫曼树的逻辑结构赫夫曼树(HuffmanTree)是一种用于数据压缩的二叉树,也称为最优二叉树。其逻辑结构主要包括以下特点:节点类型:赫夫曼树包含两种类型的节点,即内部节点(也称为非叶子......
  • 数据结构 (33)选择类排序
    前言    数据结构中的选择类排序主要包括简单选择排序(也称为选择排序)和堆排序。一、简单选择排序基本思想:简单选择排序是一种直观易懂的排序算法。它的工作原理是,在未排序序列中找到最小(或最大)元素,存放到排序序列的起始位置,然后再从剩余未排序元素中继续寻找最......
  • 数据结构 (34)归并排序
    前言    归并排序(MergeSort)是一种高效、稳定的排序算法,它采用分治法的思想,将待排序的序列分为若干个子序列,然后对这些子序列进行排序,最后再将排好序的子序列合并成一个完整的有序序列。一、基本思想    归并排序的核心思想是分治法,即将大问题分解为小问题......
  • Redis原理—1.Redis数据结构
    大纲1.Redis的数据结构2.Redis的SDS3.Redis的链表4.Redis的字典5.Redis的跳跃表6.Redis的整数集合7.Redis的压缩列表8.Redis的对象9.Redis对象的几个关键属性10.Redis的单线程为什么这么快11.Redis的典型应用场景和说明12.Redis的相关命令说明 1.Redis的数据结构......