1、归并排序
算法步骤:
- 申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列。
- 设定两个指针,最初位置分别为两个已经排序序列的起始位置。
- 比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置。
- 重复步骤3直到某一指针达到序列尾。
- 将另一序列剩下的所有元素直接复制到合并序列尾。
2、算法实现
/*
归并排序算法:
一般使用二路归并!
通俗描述:
src为待排序列,des为一个临时的目标序列,low和high指定序列的起始位置和终止位置
mid指定分割点;
分别定义两个变量,指向分割后子序列的首部,然后比较两个序列的值,按照大小顺序和并到des
*/
void Merge(int *src, int *des,int low, int mid, int high)
{
int i = low;
int j = mid + 1;
int k = low;
while( (i <= mid)&&(j <= high))
{
if(src[i] < src[j])
{
des[k++] = src[i++];
}
else
{
des[k++] = src[j++];
}
}
while(i <= mid)
{
des[k++] = src[i++];
}
while(j <= high)
{
des[k++] = src[j++];
}
}
/*
递归调用,将一个序列一致划分到只有一个元素为止!
sec指定源序列,des指定存储目标序列,low和high指定序列的起始和终止位置
len指定源序列的长度,用于分配临时目标序列
*/
void MSert(int *src,int *des,int low,int high,int len)
{
if(low == high)
{
//这里的des实际上是上一次递归中分配的temp
des[low] = src[low];
}
else
{
int mid = (low + high)/2;
int *temp = (int*)malloc(sizeof(int)*len);
//递归分割
MSert(src,temp,low,mid,len);
MSert(src,temp,mid+1,high,len);
//把子递归中的结果,传递给上一级递归中的temp,把两个子序列合并起来,作为结果,返回给上一级
//这里的des实际上是上一次递归中分配的temp
Merge(temp,des,low,mid,high);
free(temp);
}
}
void MergeSort(int *array,int len)
{
MSert(array,array,0,len-1,len);
}
3、完整源码下载
文件名:MergeSort-1.0.tar.gz
链接: http://pan.baidu.com/s/1jGw2Ske 密码: yjmy
编译步骤:
0.1 解压缩:tar -zxvf MergeSort-1.0.tar.gz
0.2 编译:gcc -std=c99 -Wall -g MergeSort.c -o MergeSort
0.3 运行:./MergeSort