首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

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

2012-09-13 
排序——分治法排序(合并)没想到第二个就是个费劲的,最怕递归,加油!?#include sorts.h#include malloc.h

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

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

?

#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;}

热点排行