排序算法 之 (归并排序)
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 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix