#ifndef CHAPTER2_H_INCLUDED
#define CHAPTER2_H_INCLUDED
/*----------------算法导论第二章-------------*/
/*--------------插入排序--------------------*/
void insertion_sort(int a[],int n)
{
int i,j,key;
for (i=1;i<n;i++) //起始位置
{
key = a[i];
for (j=i;j>0&&a[j-1]>key;j--) //从前一个开始与key比较
{
a[j]=a[j-1];
}
a[j]=key;
}
}
/*--------------分治法排序--------------------*/
void merge(int a[],int p,int q,int r) // a[p..q] a[q+1..r]
{
int len = r-p+1;
int *b = (int*)malloc(len*sizeof(int));
int i,j,k;
for (i=p,j=q+1,k=0;i<=q&&j<=r;)
{
if (a[i]<a[j]) b[k++]= a[i++];
else b[k++]= a[j++];
}
while (i<=q) b[k++]= a[i++];
while (j<=r) b[k++]= a[j++];
for (k=0;k<len;k++) a[k+p]=b[k];
free(b);
}
void merge_sort(int a[],int p,int r)
{
if (p<r)
{
int q=(p+r)/2;
merge_sort(a,p,q);
merge_sort(a,q+1,r);
merge(a,p,q,r);
}
}
/*--------------分治法计算逆序数--------------------*/
int merge_count(int a[],int p,int q,int r) // a[p..q] a[q+1..r]
{
int t=0;
int len = r-p+1;
int *b = (int*)malloc(len*sizeof(int));
int i,j,k;
for (i=p,j=q+1,k=0;i<=q&&j<=r;)
{
if (a[i]<=a[j]) b[k++]= a[i++];
else
{
b[k++]= a[j++];
t += q-i+1;//第一个数组余下的长度
}
}
while (i<=q)
{
b[k++]= a[i++];
//t+=r-q;//第二个数组的长度 /*此处大错!!!!!!!*/
}
while (j<=r) b[k++]= a[j++];
for (k=0;k<len;k++) a[k+p]=b[k];
free(b);
return t;
}
int count(int a[],int p,int r)
{
if(p==r) return 0;
int q=(p+r)/2;
return count(a,p,q)+count(a,q+1,r)+merge_count(a,p,q,r);
}
/*--------------判断集合S中是否含有两个元素其和为x---------------*/
int judge(int a[],int n,int x)
{
merge_sort(a,0,n-1);
int i,j,tmp;
for(i=0,j=n-1;i<j;)
{
tmp = a[i]+a[j];
if(x>tmp) i++;
else if(x<tmp) j--;
else
{
printf("%d+%d = %d\n",a[i],a[j],x);
return 1;
}
}
printf("no such elements!\n");
return 0;
}
#endif // CHAPTER2_H_INCLUDED
算法导论 第二章
最新推荐文章于 2021-01-31 10:24:11 发布