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