# 归并排序

## 二路归并

### 描述

1、分解：将要排序的n个元素的序列分解成两个具有n/2个元素的子序列；
2、解决：使用归并排序分别递归地排序两个子序列；
3、合并：合并两个已排序的子序列，产生原问题的解。

### 数组代码实现

#include "stdio.h"
#include "stdlib.h"
#include "assert.h"
#include "string.h"

void print_arr(int *arr, int len)
{
int i = 0;

for(i = 0; i < len; i ++)
printf("%d ",arr[i]);
printf("\n");
}

void merge(int *arr, int low, int mid, int hight, int *tmp)
{
assert(arr && low >= 0 && low <= mid && mid <= hight);

int i = low;
int j = mid + 1;
int index = 0;

while(i <= mid && j <= hight)
{
if(arr[i] <= arr[j])
tmp[index++] = arr[i++];
else
tmp[index++] = arr[j++];
}

while(i <= mid) //拷贝剩下的左半部分
tmp[index++] = arr[i++];

while(j <= hight) //拷贝剩下的右半部分
tmp[index++] = arr[j++];

memcpy((void *)(arr + low), (void *)tmp, (hight - low + 1) * sizeof(int));

}

void mergesort(int *arr, int low, int hight, int *tmp)
{
assert(arr && low >= 0);
int mid;
if(low < hight)
{
mid = (hight + low) >> 1;
mergesort(arr, low, mid,tmp);
mergesort(arr, mid + 1, hight,tmp);
merge(arr, low, mid, hight,tmp);
}
}
//只分配一次内存，避免内存操作开销
void mergesort_drive(int *arr, int len)
{
int *tmp = (int *)malloc(len * sizeof(int));
if(!tmp)
{
printf("out of memory\n");
exit(0);
}

mergesort(arr, 0, len - 1, tmp);

free(tmp);
}

int main()
{
int data[10]={8,7,2,6,9,10,3,4,5,1};

int len = sizeof(data)/sizeof(data[0]);
mergesort_drive(data, len);
print_arr(data,len);

return 0;
}


### 链表代码实现

/*

*/

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
typedef int Item;

typedef struct Node
{
Item data;
struct Node *next;
}Node,*ptrNode;

ptrNode CreatListTail(int len);
void print_List(ptrNode List);
void Mergesort_List(ptrNode *List);
void Split_List(ptrNode List, ptrNode *List_A, ptrNode *List_B);
ptrNode Merge_List(ptrNode List_A, ptrNode List_B);

{
int i;
ptrNode p;

ptrNode List = (ptrNode)malloc(sizeof(struct Node));
List->next   = NULL;

for(i = 0; i < len; i ++)
{
p = (ptrNode)malloc(sizeof(struct Node));
p->data = i + 1;
p->next = List->next;
List->next = p;
}

return List;
}

ptrNode CreatListTail(int len)
{
int i;
ptrNode p;
srand(time(0));
ptrNode List = (ptrNode)malloc(sizeof(struct Node));

ptrNode Tail = List;
for(i = 0; i < len; i ++)
{
p = (ptrNode)malloc(sizeof(struct Node));
p->data = rand() % len + 1;
Tail->next = p;
Tail  = p;
}
Tail->next = NULL;
return List;
}

void print_List(ptrNode List)
{

while(List != NULL)
{
printf("%d ",List->data);
List = List->next;
}
printf("\n");
}

void Mergesort_List(ptrNode *List)
{
ptrNode List_A;
ptrNode List_B;

return;

Mergesort_List(&List_A);
Mergesort_List(&List_B);

*List = Merge_List(List_A,List_B);
}

void Split_List(ptrNode List, ptrNode *List_A, ptrNode *List_B)
{
ptrNode fast_list;
ptrNode low_list;

if(List == NULL || List->next == NULL)
{
*List_A = List;
*List_B = NULL;
}

else
{
low_list  = List;
fast_list = List->next;

while(fast_list != NULL)
{
fast_list = fast_list->next;
if(fast_list != NULL)
{
low_list  = low_list->next;
fast_list = fast_list->next;
}
}

*List_A = List;
*List_B = low_list->next;
low_list->next = NULL;
}
}

ptrNode Merge_List(ptrNode List_A, ptrNode List_B)
{
ptrNode List_Result = NULL;
if(List_A == NULL)
return List_B;
if(List_B == NULL)
return List_A;

if(List_A->data <= List_B->data)
{
List_Result = List_A;
List_A = List_A->next;
}

else
{
List_Result = List_B;
List_B = List_B->next;
}

List_Result->next = Merge_List(List_A,List_B);

return List_Result;
}

int main()
{
ptrNode List;

print_List(List);

Mergesort_List(&List);

print_List(List);

return 0;
}


• 本文已收录于以下专栏：

## 对数组进行归并排序

• wusecaiyun
• 2015年09月21日 16:36
• 605

## 归并排序C++实现——基于数组的

• ke1950523491
• 2017年11月30日 10:01
• 65

## 高效链表排序-归并算法

• wejoncy
• 2016年05月03日 11:45
• 2021

## 用归并排序对链表进行排序

• lalor
• 2012年04月06日 00:24
• 15299

## 排序算法系列：归并排序算法

• u013761665
• 2016年05月27日 16:32
• 10664

## 排序算法（2）——归并排序

• tmylzq187
• 2016年07月03日 17:48
• 19459

## 白话经典算法系列之五 归并排序的实现（讲的真好）

• yuehailin
• 2017年04月03日 16:25
• 18015

## 归并排序(递归实现和迭代实现)

//首先是递归实现的方式#include #define MAXSIZE 10 //实现归并，并把数据都放在list1里面 void merging(int *list1,int list1_si...
• chencangui
• 2015年03月27日 17:55
• 3838

## 八大排序算法详解——归并排序

• cy__dream
• 2017年02月08日 20:25
• 1808

## 数据结构——归并排序算法

• u013271921
• 2015年05月26日 14:33
• 7130

举报原因： 您举报文章：数组和链表的归并排序算法实现（C语言） 色情 政治 抄袭 广告 招聘 骂人 其他 (最多只允许输入30个字)