归并排序
时间复杂度:O(nlogn)
空间复杂度:O(n)
稳定性:稳定
实现原理:采用分治法(Divide and Conquer)将已有序的子序列合并,得到完全有序的序列,即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,也叫二路归并。
代码实现:采用递归方法实现
#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 10
//实现归并并把最后结果保存到listl中
void Merging(int *listl,int listl_Size,int *listr,int listr_Size)
{
int i,j,k,n;
int tmp[MAXSIZE]; //临时数组存放排序好的数据
i=j=k=0;
/*i是指向listl的下标 ,j是指向listr的下标*/
while(i<listl_Size && j<listr_Size)
{
//实现排序,小的先存放
if(listl[i]<listr[j])
{
tmp[k++]=listl[i++];
}
else
{
tmp[k++]=listr[j++];
}
}
//把最大的依次追加在最后
while(i<listl_Size)
{
tmp[k++]=listl[i++];
}
while(j<listr_Size)
{
tmp[k++]=listl[j++];
}
//把临时数组的数据存放到listl中
for(n=0;n<listl_Size+listr_Size;n++)
{
listl[n]=tmp[n];
}
}
void Merge_sort(int a[],int len)
{
/*
只有当len大于1时才递归,否则结束递归
*/
if(len>1)
{
int *listl=a;//定义指针指向数组左半部分
int listl_Size=len/2;
int *listr=a + len/2;//定义指针指向数组右半部分
int listr_Size=len - listl_Size;
Merge_sort(listl,listl_Size);
Merge_sort(listr,listr_Size);
//实现归并
Merging(listl,listl_Size,listr,listr_Size);
}
}
//测试代码
int main(int argc, char const *argv[])
{
int array[]={123,56,89,2,65,3};
Merge_Sort(array,6);
int i;
for( i = 0 ; i < 6 ; i++)
{
printf("%d ",array[i]);
}
return 0;
}