# 【算法导论】分治法及归并排序

(1).原问题==（划分）== >>若干个更小规模的子问题。

(2).要求子问题的求解方法与原问题相同。

（1）分解(Divide)：将当前问题划分成若干子问题

（2）解决(Conquer)：递归解子问题，如果子问题足够小则直接解

（3）合并(Combine)：将子问题的解合并长原问题

/*
《Introduction to Algorithms(second edition)》
chapter2，MERGE_SORT()
date：2014-9-18
*/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <limits.h>

#define MAX 50

typedef struct
{
int arr[MAX+1];
int length;
}SortArr;

SortArr *CreateSortArr()
{
int i = 0;
char buf[4*MAX] = "";
char *ptr = NULL;
SortArr *sortArr = (SortArr *)malloc(sizeof(SortArr));
memset(sortArr, 0, sizeof(SortArr));

printf("请输入待排序数据，以逗号分隔，以分号结束\n"
"例：23,12,65,36,35;\n"
"input:");
scanf("%s", buf);

ptr = buf;
sortArr->arr[i] = 0;	//arr[0]不存值用作哨兵单元
i = 1;
while(*ptr != ';')
{
sortArr->arr[i] = atoi(ptr);
i++;

ptr = strstr(ptr, ",");
if(!ptr)
{
break;
}
ptr++;
}
sortArr->length = (i - 1);

return sortArr;
}

int merge(int arr[], int p, int q, int r)
{
int i = 0;
int j = 0;
int k = 0;
int n1 = 0;
int n2 = 0;
int *leftArr = NULL;
int *rightArr = NULL;

n1 = q - p + 1;
n2 = r - q;

//为了和arr[]下标保持一致，leftArr[0]和rightArr[0]不用
leftArr = (int *)malloc((n1 + 2) * sizeof(int));
rightArr = (int *)malloc((n2 + 2) * sizeof(int));

for(i = 1; i <= n1; i++)
{
leftArr[i] = arr[p+i-1];
}
for(j = 0; j <= n2; j++)
{
rightArr[j] = arr[q+j];
}

i = 1;
j = 1;

//将最后一个数设置为哨兵
leftArr[n1+1] = INT_MAX;
rightArr[n2+1] = INT_MAX;

for(k = p; k <= r; k++)
{
if(leftArr[i] <= rightArr[j])
{
arr[k] = leftArr[i];
i++;
}
else
{
arr[k] = rightArr[j];
j++;
}
}

free(leftArr);
free(rightArr);
return 0;
}

int mergeSort(int arr[], int p, int r)
{
int q = 0;

if(p < r)
{
q = (p + r) / 2;
mergeSort(arr, p, q);
mergeSort(arr, (q+1), r);
merge(arr, p, q, r);
}

return 0;
}

int MergingSortRecursion(SortArr *sortArr)
{
mergeSort(sortArr, 1, sortArr->length);
return 0;
}

int PrintArray(SortArr sortArr)
{
int i = 0;

for(i = 1; i <= sortArr.length; i++)
{
printf("%d,", sortArr.arr[i]);
}
printf("\b;\n");

return 0;
}

int main()
{
SortArr *sortArr = NULL;
sortArr = CreateSortArr();

printf("\nBefore Sort：\t");
PrintArray(*sortArr);

MergingSortRecursion(sortArr);

printf("Sorted Array：\t");
PrintArray(*sortArr);

free(sortArr);

return 0;
}


#### 算法导论九大排序总结

2016-09-22 20:40:06

#### 算法导论学习之分治法

2017-04-17 22:17:28

#### 算法导论-分治法-合并排序的Python&amp;C++实现

2017-09-18 17:09:24

#### 算法导论--归并法排序

2015-03-26 20:07:54

#### 算法导论学习笔记（一）排序算法之分治排序

2016-03-02 22:28:15

#### 算法导论-排序

2018-04-08 18:32:47

#### 算法导论：分治法，python实现合并排序MERGE-SORT

2018-01-10 11:59:05

#### 算法导论（三）——分治法

2017-10-22 17:01:07

#### 算法导论——分治法——最大子数组问题

2015-07-19 20:37:33

#### 算法导论-排序-快速排序

2016-10-11 10:53:05