• (C语言)数据结构——归并排序


    基本思想:

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

    具体实现(递归版本):

    我们先创建一个和a大小相同的数组,因为有数组a和个数n是不够的,所以创建一个_MergeSort()作为MergeSort()的一个子函数来控制开头(begin)和结尾(end),先取中间值坐标,若中间值坐标的左右两个数组都有序,那么取两个数组中小的尾插,最后再拷贝回原数组归并哪部分就拷贝哪部分回去。我们发现递归在这里非常神奇!
    在这里插入图片描述
    实现代码:

    void _MergeSort(int* a, int begin, int end, int* tmp)
    {
    	if (begin == end)
    		return;
    
    	int mid = (end + begin) / 2;
    	// [begin, mid] [mid+1, end]
    
    	_MergeSort(a, begin, mid, tmp);
    	_MergeSort(a, mid+1, end, tmp);
    
    	// 取小的尾插
    	// [begin, mid] [mid+1, end]
    	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, (end-begin+1)*sizeof(int));
    }
    
    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);
    
    	free(tmp);
    	tmp = NULL;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56

    最后是一张动图:他这里是从底层往最高层演示的
    在这里插入图片描述

    归并排序的特性总结:

    1. 归并的缺点在于需要O(N)的空间复杂度,归并排序的思考更多的是解决在磁盘中的外排序问题。
    2. 时间复杂度:O(N*logN)
    3. 空间复杂度:O(N)
    4. 稳定性:稳定
  • 相关阅读:
    聊聊“死锁“
    机器学习算法 —— 1. K近邻算法
    预制菜还没火,加盟商已经亏惨了
    salesforce零基础学习(一百三十)Report 学习进阶篇
    09 多线程与高并发 - CompletableFuture 源码解析
    Docker的安装部署
    音频之Android NDK读写声卡
    JS代码压缩
    全排列问题
    mysql有关查询的操作
  • 原文地址:https://blog.csdn.net/qq_55712347/article/details/126860135