近期由于找工作,对归并排序算法也进行了一些研究,虽然网上有很多类似的算法代码实现,但是总是不太完整,闲来无聊对其他人的算法代码进行了一些整理,整理出了一份完整的实现代码,感谢其他博客的原创,也希望爱好编程的人能借鉴。下面是具体的代码实现:
#include <stdio.h>
#include <malloc.h>
/**
* 复制数组
* source:源数组
* dest:目标数组
* len:源数组长度
* first:目标数组起始位置
*
*/
void copyArray(int source[], int dest[],int len,int first)
{
int i;
int j=first;
for(i=0;i<len;i++)
{
dest[j] = source[i];
j++;
}
}
void merge(int a[],int left,int right)
{
int begin1 = left;
int mid = (left+right)/2;
int begin2 = mid+1;
int k=0;
int newArrayLen = right-left+1;
int *b = (int*)malloc(newArrayLen*sizeof(int));
while(begin1<=mid && begin2<=right)
{
if(a[begin1]<=a[begin2])
b[k++] = a[begin1++];
else
b[k++] = a[begin2++];
}
while(begin1<=mid)
b[k++] = a[begin1++];
while(begin2<=right)
b[k++] = a[begin2++];
copyArray(b,a,newArrayLen,left);
free(b);
}
void mergeSort(int a[],int left,int right)
{
int i;
if(left < right)// 保证至少有两个元素
{
i = (left+right)/2;
mergeSort(a,left,i);
mergeSort(a,i+1,right);
merge(a,left,right);
}
}
void showArray(int *a,int len)
{
for (int i=0;i<len;i++)
{
printf("%d ",a[i]);
}
printf("\n");
}
int main()
{
int a[] = {5, 18, 151, 138, 160, 63, 174, 169, 79, 200};
int len = sizeof(a)/sizeof(int);
showArray(a,len);
mergeSort(a,0,len-1);
showArray(a,len);
return 0;
}