排序算法 之 (归并排序)

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 @ 2023-03-15 18:15  水三丫  阅读(24)  评论(0编辑  收藏  举报