没想到第二个就是个费劲的,最怕递归,加油!
#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;
}
361

被折叠的 条评论
为什么被折叠?



