归并排序 二分查找
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;
}
#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;
}
相关文章推荐
- 分治策略(归并排序,二分查找,x的n次方,斐波那契(Fibonacci)数列,斯特拉森(Strassen)矩阵乘法)
- JAVA冒泡排序,归并排序,二分查找
- 归并排序、插入排序、快速排序、二分查找的c++实现
- 2015/10/06写下的归并排序、快速排序、二分查找
- 递归算法——归并排序,快速排序,二分查找
- python中实现二分查找,插入排序,归并排序,快速排序
- 算法学习-归并排序和二分查找
- 【算法】_009_插入排序_二分查找优化
- 二分查找以及二分查找的时间复杂度
- 关于二分查找的一些认识
- 二分查找单调队列
- 查找--二分查找
- erlang 实现list的二分查找
- 排序列表转换为二分查找树-LintCode
- C++ Binary Search Sort 二分查找排序算法
- 【POJ】2002 - Squares(暴力枚举 & 双关键字二分查找)
- 二分查找 扫描文件夹
- 二分查找 C 、C++STL
- 以斐波那契数列和二分查找为例——探究时间复杂度 和 空间复杂度
- 算法 —— 二分查找