并归排序

/***************
并归排序
***************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#define LEN 5

void arr_init(int num[], int len)
{
	int i;

	srand(time(NULL));
	for(i = 0; i < len; i++){
		num[i] = rand()%50;
	}

}

void arr_print(int num[], int len)
{
	int i;

	for(i = 0; i < len; i++){
		printf("%d ", num[i]);
	}
	printf("\n");

}

void merge(int num[], int start, int end)
{
	int mid, lenl, lenr, i, j, k;
	int *pl, *pr;

	mid = (start + end) / 2;
	lenl = mid - start + 1;
	lenr = end - mid;

	pl = (int *)malloc(lenl * sizeof(int));
	pr = (int *)malloc(lenr * sizeof(int));

	if(!pl || !pr){
		printf("malloc fail\n");
		exit(1);
	}

	memcpy(pl, num + start, lenl * sizeof(int));
	memcpy(pr, num + mid + 1, lenr *  sizeof(int));

	i = j = 0, k = start;

	while(i < lenl && j < lenr){
		if(pl[i] < pr[j]){
			num[k++] = pl[i++];
		}else{
			num[k++] = pr[j++];
		}
	}

	if(i < lenl){
		memcpy(num + k, pl + i, (lenl - i) * sizeof(int));
	}
	if(j < lenr){
		memcpy(num + k, pr + i, (lenl - i) * sizeof(int));
	}
	free(pl);
	free(pr);
}
void merge_sort(int num[], int start, int end)
{
	if(start >= end)
		return;
	int mid = (start + end ) / 2;
	merge_sort(num, start, mid);
	merge_sort(num, mid + 1, end);
	merge(num, start, end);
}

int main(void)
{
	int num[LEN];
	arr_init(num, LEN);
	arr_print(num, LEN);
	merge_sort(num, 0, LEN - 1);
	arr_print(num, LEN);
	return 0;
}

你可能感兴趣的:(并归排序)