# 分治法小结

448人阅读 评论(0)

divide_and_conquer(P(n))
{
if(n<=n0)//分治阀值
else
{
divide P into smaller subinstances P1,P2,…,Pk//分解问题

for(i=1; i<k; i++)//分别求解
yi = divide_and_conquer(Pi);

return merge(y1,y2,…,yk);//最后合并问题的解
}
}

template<typename Type>
int split(Type A[],int low,int high)
{
//功能：对数组元素部分划分，使前面的元素都小于枢轴点，后面的都大于枢轴点
//输入：数组首地址A，划分起始位置下标low，划分终点位置下标high
//输出：返回枢轴点新下标，划分好的新数组
//说明：以A[low]元素作为划分枢点
int i=low;
Type x = A[low];
for(int k = low+1;k <= high;k++)
{
if(A[k]<=x)
{
i = i+1;
if(i!=k) swap(A[i],A[k]);
}
}
swap(A[low],A[i]);
return i;
}

template <typename Type>
void quick_sort(Type A[],int low,int high)
{
<span style="white-space:pre">	</span>//功能：快速排序
<span style="white-space:pre">	</span>//输入：待排序数组首地址A，排序下标范围low-high(含两个端点)
<span style="white-space:pre">	</span>//输出：排序好的数组
<span style="white-space:pre">	</span>//说明：递归调用自身直至low>=high成立，即只剩一个元素为止
int k;
if(low < high)
{
k = split(A,low,high);
quick_sort(A,low,k-1);
quick_sort(A,k+1,high);
}
}

template <typename Type>
Type select(Type A[],size_t n,size_t k)
{
int i,j,s,t;
Type m,*p,*q,*r;
if(n<=38)
{
merge_sort(A,n);
return A[k-1];
}
p = new Type[3*n/4];
q = new Type[3*n/4];
r = new Type[3*n/4];
for(i = 0;i<n/5;i++)
mid(A,i,p);
m = select(p,i,i/2+i%2);
i = j = s = 0;
for(t = 0; t<n; t++)
if(A[t]<m)
p[i++] = A[t];
else if(A[t]==m)
q[j++] = A[t];
else
r[s++] = A[t];
if(i>k)
return select(p,i,k);
else if(i+j>=k)
return m;
else
return select(r,s,k-i-j);
}

template <typename Type>
void merge(Type A[],size_t low,size_t mid,size_t high)
{
//归并算法，low、mid、high都是下标
Type *B = new Type[high-low+1];
int i = low;
int j = mid;
int k = 0;
while(i<mid && j<=high)
{
if(A[i]<A[j])
{
B[k++]=A[i++];
}
else
{
B[k++]=A[j++];
}
}
while(i<mid) B[k++]=A[i++];
while(j<=high) B[k++]=A[j++];
for(int i=0; i<high-low+1; i++)
A[i]=B[i];
delete[] B;
}
//merge_sort的模板函数
template <typename Type>
void merge_sort(Type A[],size_t n)
{
//归并算法
n = n -1;//将n转化为下标
if(n<=0) return;
else
{
merge_sort(A,n/2+1);
merge_sort(A+n/2+1,n-n/2);
merge(A,0,n/2+1,n);
}
}
//取A中每5个元素的中值
template <typename Type>
void mid(Type A[],size_t i,Type p[])
{
size_t k = 5*i;
if(A[k]>A[k+2])
swap(A[k],A[k+2]);
if(A[k+1]>A[k+3])
swap(A[k+1],A[k+3]);
if(A[k]>A[k+1])
swap(A[k],A[k+1]);
if(A[k+2]>A[k+3])
swap(A[k+2],A[k+3]);
if(A[k+1]>A[k+2])
swap(A[k+1],A[k+2]);
if(A[k+4]>A[k+2])
p[i]=A[k+2];
else if(A[k+4]>A[k+1])
p[i]=A[k+4];
else
p[i]=A[k+1];

}

1
0

* 以上用户言论只代表其个人观点，不代表CSDN网站的观点或立场
个人资料
• 访问：27064次
• 积分：875
• 等级：
• 排名：千里之外
• 原创：56篇
• 转载：0篇
• 译文：0篇
• 评论：9条
最新评论