前提条件
简介
- 归并排序(Merge Sort)是建立在归并操作上的一种有效,稳定的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。
- 归并排序是稳定的排序.
- 时间复杂度
O
(
n
l
o
g
n
)
O(n log n)
O(nlogn),空间复杂度为
O
(
n
)
O(n)
O(n).

归并排序算法
void merge(int data[],int low,int mid,int high)
{
int i,p,k;
int *tmp;
tmp = (int *)malloc((high-low+1)*sizeof(int));
if(!tmp) exit(0);
k=0;
for ( i = low,p = mid; i < mid&&p<=high;)
{
if(data[i]<data[p])
{
tmp[k++]=data[i++];
}
else
{
tmp[k++]=data[p++];
}
}
while (i<mid)
{
tmp[k++]=data[i++];
}
while (p<=high)
{
tmp[k++]=data[p++];
}
i = low;
p=0;
while (p<k)
{
data[i++]=tmp[p++];
}
}
void mergeSort(int data[],int s,int t)
{
int m;
if(s<t){
m=(s+t)/2;
mergeSort(data,s,m);
mergeSort(data,m+1,t);
merge(data,s,m+1,t);
}
}

完整代码
#include<stdio.h>
#include<stdlib.h>
void merge(int data[],int low,int mid,int high)
{
int i,p,k;
int *tmp;
tmp = (int *)malloc((high-low+1)*sizeof(int));
if(!tmp) exit(0);
k=0;
for ( i = low,p = mid; i < mid&&p<=high;)
{
if(data[i]<data[p])
{
tmp[k++]=data[i++];
}
else
{
tmp[k++]=data[p++];
}
}
while (i<mid)
{
tmp[k++]=data[i++];
}
while (p<=high)
{
tmp[k++]=data[p++];
}
i = low;
p=0;
while (p<k)
{
data[i++]=tmp[p++];
}
}
void mergeSort(int data[],int s,int t)
{
int m;
if(s<t){
m=(s+t)/2;
mergeSort(data,s,m);
mergeSort(data,m+1,t);
merge(data,s,m+1,t);
}
}
int main(){
int data[6]={4,6,5,1,3,2};
mergeSort(data,0,5);
printf("the result of the mergeSort:\n");
for (int i = 0; i < 6; i++)
{
printf("%d ",data[i]);
}
printf("\n");
system("pause");
return 0;
}
输出结果
