排序算法 之 (归并排序)

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
posted @   水三丫  阅读(31)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
点击右上角即可分享
微信分享提示