/*****************************
*归并排序:时间复杂度O(nlgn)
*一种稳定的排序算法
*主要思想:分治
*
*下面代码使用的是二路归并排序(内部排序)
*那k路归并排序呢?其时间复杂度是多少呢?
* ****************************/
void Sort(int *ary, int n)//归并排序,数组下标从0开始
{
int *tp = malloc(n * sizeof(int));//申请的临时空间,用于合并。故空间复杂度O(n)
if(tp == NULL){
fprintf(stderr,"tp malloc failed!\n");
exit(1);
}
Merge_Sort(ary,n,tp);
free(tp);
}
void Merge_Sort(int *ary, int n, int *tp)
{
if(n == 1) return;
Merge_Sort(ary,n/2,tp);
Merge_Sort(ary+n/2,(n+1)/2,tp);
//下面将两个有序的子序列合并为一个有序的序列
int i, j, k;
k = 0;
i = 0;
j = n/2;
while(i < n / 2 && j < n)
{
if(ary[i] > ary[j])///此处注意判断条件保证排序的稳定性,即对于相等的情况,应将j所对应的元素排在i的后面
{
tp[k] = ary[j];
++j;
}
else
{
tp[k] = ary[i];
++i;
}
++k;
}
while(i < n / 2)
{
tp[k] = ary[i];
++i;
++k;
}
while(j < n)
{
tp[k] = ary[j];
++j;
++k;
}
for(i = 0; i < n; ++i)
ary[i] = tp[i];
}
排序算法—归并排序
最新推荐文章于 2021-01-12 10:17:42 发布