排序——分治法排序(合并)

没想到第二个就是个费劲的,最怕递归,加油!

 

#include "sorts.h"
#include <malloc.h>
#include <stdlib.h>
#include <memory.h>

static void merge(int * arr, unsigned int p, unsigned int q, unsigned r)
{
	int * leftArr = NULL;
	int * rightArr = NULL;
	unsigned int leftLength = q - p + 1;
	unsigned int rightLength = r - q;
	unsigned int iLoop = 0;
	unsigned int leftPos = 0;
	unsigned int rightPos = 0;
	leftArr = (int*)malloc(leftLength * sizeof(int));
	rightArr = (int*)malloc(rightLength * sizeof(int));
	if(!leftArr || !rightArr)
	{
		goto FREE_AND_RETURN;
	}
	memcpy(leftArr, arr + p, leftLength * sizeof(int));
	memcpy(rightArr, arr + q + 1, rightLength * sizeof(int));

	for(iLoop = p, leftPos = 0, rightPos = 0; iLoop < r + 1; ++iLoop)
	{
		if(leftPos == leftLength)
		{
			memcpy(arr + iLoop, rightArr + rightPos, (rightLength - rightPos) * sizeof(int));
			break;
		}
		if(rightPos == rightLength)
		{
			memcpy(arr + iLoop, leftArr + leftPos, (leftLength - leftPos) * sizeof(int));
			break;
		}
		if(leftArr[leftPos] < rightArr[rightPos])
		{
			arr[iLoop] = leftArr[leftPos];
			++leftPos;
		}
		else
		{
			arr[iLoop] = rightArr[rightPos];
			++rightPos;
		}
	}

FREE_AND_RETURN:
	if(leftArr)
	{
		free(leftArr);
	}
	if(rightArr)
	{
		free(rightArr);
	}
	return;
}

static void merge_sort_proc(int * arr, unsigned int beginPos, unsigned int endPos)
{
	unsigned int mPos = (beginPos + endPos) / 2;
	if(beginPos + 1 < endPos)
	{
		merge_sort_proc(arr, beginPos, mPos);
		merge_sort_proc(arr, mPos + 1, endPos);
	}
	merge(arr, beginPos, mPos, endPos);
	return;
}


int merge_sort(int * arr, unsigned int arrCount)
{
	if(arr == NULL)
	{
		return -1;
	}
	merge_sort_proc(arr, 0, arrCount - 1);
	return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值