排序算法 之 (归并排序)
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