归并排序的算法,归并就是将不同的数组并在一起并排序,这里实现的是2路归并,原理是将一个数组,拆分成2个数组,左边的是left ,右边的是right,左右分别排序,排序后再用归并排序的算法进行归并。
参考链接
https://www.bilibili.com/video/BV1Ax411U7Xx?from=search&seid=1002695510884195792
#include<stdio.h>
void merge(int arr[],int L,int M,int R)
{
int LEFT_SIZE = M-L;
int RIGHT_SIZE = R-M+1;
int left[LEFT_SIZE];
int right[RIGHT_SIZE];
int i;
int j;
int k;
//1、fill in the left sub array
for ( i = L; i < M; i++)
{
left[i-L] = arr[i];
}
//2、fill in the right sub array
for ( i = M; i <= R; i++)
{
right[i-M] = arr[i];
}
//Merge into the orignal array
i = 0; j = 0; k = L;
while (i <LEFT_SIZE && j< RIGHT_SIZE )
{
if(left[i]<right[j])
{
arr[k] = left[i];
i++;
k++;
}else
{
arr[k] = right[j];
j++;
k++;
}
}
while(i<LEFT_SIZE)
{
arr[k] = left[i];
i++;
k++;
}
while (j<RIGHT_SIZE)
{
arr[k] = right[j];
j++;
k++;
}
// for (int i = 0; i < LEFT_SIZE; i++)
// {
//
// printf("%d\n",left[i])
// }
// for (int i = 0; i < RIGHT_SIZE; i++)
// {
//
// printf("%d\n",right[i])
// }
}
void mergeSort(int arr[],int L ,int R)
{
if(L ==R)
return;
else
{
int M = (L+R ) /2;
mergeSort(arr,L,M);
mergeSort(arr,M+1,R);
merge(arr,L,M+1,R);
}
}
int main()
{
int arr[] = {6,8,10,9,4,5,2,7};
int L = 0;
int R = 7;
mergeSort(arr,L,R);
int i ;
for (i = 0; i <= R; i++)
{
printf("%d\n",arr[i]);
}
return 0;
}