#include <stdio.h>
#include <stdlib.h>
/*
分治法排序
*/
#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+2];//L[1]...L[n]存放n个数,L[n+1]存放哨兵值
int R[n2+2];
for(i=1;i<=n1;i++)
L[i]=a[p+i-1];
for(j=1;j<=n2;j++)
R[j]=a[q+j];
L[n1+1]=1000;
R[n2+1]=1000;
i=1;j=1;
for(k=p;k<=r;k++)
{
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;
}
算法入门--分治法排序(调用合并排序,使用哨兵进行判断)
最新推荐文章于 2023-09-18 03:56:34 发布