PracticeDev/study_clang/two-way-merge-sort.c

82 lines
1.6 KiB
C
Raw Normal View History

2022-12-20 17:31:11 +08:00
/*************************************************************************
> File Name: two-way-merge-sort.c
> Description: two-way-merge-sort.c
> Author: lkong
> Mail: lkong@tencent.com
> Created Time: 2021-12-15 21:33:35
************************************************************************/
#include <stdio.h>
#include <stdlib.h>
// https://www.cnblogs.com/horizonice/p/4102553.html
// https://blog.csdn.net/darkrabbit/article/details/90240709
void Merge(int array[], int p, int q, int r);
void MergeSort(int array[], int p, int q);
int main()
{
//int array[7] = {1,3,5,2,4,5,10};
int array[8] = {5,2,4,7,1,3,2,6};
int i = 0;
MergeSort(array, 0, 7);
//Merge(array, 0, 2, 6);
for(i; i < 8; i++)
printf("%d ", array[i]);
return 0;
}
//合并过程中 p<=q<r
void Merge(int array[], int p, int q, int r)
{
int n1 = q - p + 1;
int n2 = r - q;
int *L;
L = (int*)malloc(sizeof(int)*n1);
int *R;
R = (int*)malloc(sizeof(int)*n2);
int i = 0;
int j = 0;
for(i; i < n1; i++)
L[i] = array[i + p];
for(j; j < n2; j++)
R[j] = array[j + q +1];
i = j = 0;
int k = p;
while(i!=n1 && j!= n2)
{
if(L[i] <= R[j])
array[k++] = L[i++];
else
array[k++] = R[j++];
}
while(i < n1)
array[k++] = L[i++];
while(j < n2)
array[k++] = R[j++];
free(L);
free(R);
}
void MergeSort(int array[], int p, int q)
{
if(p < q)
{
int r = (p+q)/2;
MergeSort(array, p, r);
MergeSort(array, r+1, q);
Merge(array,p, r, q);
}
}