#include <stdio.h>
#include <stdlib.h>
/*
分治法排序 O(n*lgn)
*/
#define MAXN 100
int a[MAXN];
void merge(int p,int q,int r)//原始合并排序算法,适用于任意长度的两个数据段
{
int i,j,k;
int n1=q-p+1;
int n2=r-q;
int L[n1+1];//L[1]...L[n]存放n个数
int R[n2+1];
for(i=1;i<=n1;i++)
L[i]=a[p+i-1];
for(j=1;j<=n2;j++)
R[j]=a[q+j];
i=1;j=1;
for(k=p;k<=r;k++)
{
if(i==n1+1)//L中已经无元素,将R剩余元素复制到a中
{
a[k]=R[j];
j++;
}
else if(j==n2+1)//R中已经无元素,将L剩余元素复制到a中
{
a[k]=L[i];
i++;
}
else
{
if(L[i]<R[j])
{
a[k]=L[i];
i++;
}
else
{
a[k]=R[j];
j++;
}
}
}
}
void merge_sort(int p,int r)
{
int q;
if(p<r)
{
q=(p+r)/2;
merge_sort(p,q);
merge_sort(q+1,r);
merge(p,q,r);
}
}
int main(int argc, char *argv[])
{
int n,i;
printf("输入n\n");
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%d",&a[i]);
merge_sort(0,n-1);
printf("分治法排序后\n");
for(i=0;i<n;i++)
printf("%d ",a[i]);
system("PAUSE");
return 0;
}
算法入门-分治法(合并排序中不使用哨兵)
最新推荐文章于 2022-08-09 11:55:55 发布