排序算法 之 (归并排序)
10.7、归并排序
了解归并排序之前,我们先来了解归并,
给定两个数组A、B,A和B都是有序的,把A和B合并为一个有序的数组,其实我们就可以采用双指针来分别指向的A和B来对比并移动指针,然后需要一个辅助数组来记录排序后的值
二路归并的图解
归并排序图解
先对给定一个数组,进行划分为多个二路归并,然后归并后进行在归并,依次递归的进行下去,之间看图解吧
归并排序的代码实现
#include <stdio.h> #include <stdlib.h> #define boolean int #define false 0; #define true 1; int *C;//全局变量,辅助数组来完成归并 //二路归并,两个有序数组的合并,low表示A数组开始的位置,mid表示A数组结束的位置;mid+1表示B数组开始的位置,high表示B数组结束的位置 void Merge(int nums[],int low,int mid,int high){ int i,j,k;//三个数组下标指针,分别i表示第一个数组,j表示第二个数组 for(k = low;k <= high;k++){//把low到high位置的元素复制到辅助数组中 C[k] = nums[k]; } for(i = low,j=mid+1,k=i;i<=mid&&j<=high;k++){ if(C[i] <= C[j]){ //将小的元素放入到nums中 nums[k] = C[i++]; }else{ nums[k] = C[j++]; } } //没有放完的进行全部放入 while(i<=mid) nums[k++] = C[i++]; while(j<=high) nums[k++] = C[j++]; } //归并排序:nums:是数组,low是开始的下标,hight是结束的下标 void MergeSort(int nums[],int low,int high){ if(low < high){ int mid = (low + high)/2;//从中间划分 MergeSort(nums,low,mid);//左边部分 MergeSort(nums,mid+1,high);//右边部分 Merge(nums,low,mid,high);//二路归并 } } int main(){ int nums[] = {49,38,65,97,76,13,27,47,89,13,48,76,88,88,99}; int length = 15; printf("归并排序前:"); for(int i = 0; i < length ;i++){ printf("%d ",nums[i]); } C = (int *)malloc(sizeof(int)*length);//归并排序辅助数组的大小 MergeSort(nums,0,length-1); printf("\n"); printf("归并排序后:"); for(int i = 0; i < length ;i++){ printf("%d ",nums[i]); } return 0; } //结果: 归并排序前:49 38 65 97 76 13 27 47 89 13 48 76 88 88 99 归并排序后:13 13 27 38 47 48 49 65 76 76 88 88 89 97 99
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通