您的位置:首页 > 其它

归并排序 二分查找

2016-10-27 23:20 281 查看
#include<iostream>

#include<cstdio>

#include<stdlib.h>

using namespace std;

void merge(int a[],int p,int q,int r)

{
int i,j,k,n1,n2;
int *front,*back;
n1=q-p+1;
n2=r-q;
front=(int*)malloc(n1*sizeof(int));
back=(int*)malloc(n2*sizeof(int));
for(i=0;i<n1;i++)
{
front[i]=a[p+i]; 
}
for(i=0;i<n2;i++)
{
back[i]=a[q+i+1];
}
i=0;
j=0;
k=p;
while(i<n1&&j<n2)
{
if(front[i]<back[j])
{
a[k++]=front[i++];
}
else
{
a[k++]=back[j++];
}
}
while(i<n1)
{
a[k++]=front[i++];
}
while(j<n2)
{
a[k++]=back[j++];
}

}

void merge_sort(int a[],int p,int r)

{
int q;
if(p<r)
{
q=(p+r)/2;
merge_sort(a,p,q);
merge_sort(a,q+1,r);
merge(a,p,q,r);
}

}

int main()

{
int a[8]={1,2,4,5,6,7,3,9};
int i;
merge_sort(a,0,7);
for(i=0;i<8;i++)
printf("%d ",a[i]);
return 0;

}

void merge_sort(int* A,int x,int y,int* T)

{
if(y-x>1)
{
int m=x+(y-x)/2;
int p=x,q=m,i=x;
merge_sort(A,x,m,T);
merge_sort(A,m,y,T);
while(p<m||q<y)
{
if(q<=y||(p<m&&A[p]<=T[q]))
T[i++]=A[p++];
else
{
T[i++]=A[q++];
cnt+=m-p;//求逆序数
}
}
for(i=x;i<y;i++)
A[i]=T[i];
}

}

int bsearch(int* A,int x,int y,int v)

{
int m;
while(x<y)
{
m=x+(y-x)/2;
if(A[m]==v)
return m;
else if(A[m]>v)
y=m;
else 
x=m+1;
}
return -1;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: