您的位置:首页 > 编程语言 > C语言/C++

C++修炼笔记----------利用合并排序提升排序效率(分而治之---Divide-Conquer )

2010-04-16 15:07 375 查看
最近在看算法导论,看到了分而治之这一块。将排序的性能提升到n*log(n)。

反正刚好在熟悉C++,就拿来实现一下吧。

#include <string>
#include <iostream>
#include <vector>
using namespace std;
void Merge(int a[],int p, int q, int r)
{
int n1 = q - p + 1;
int n2 = r -q;
int ary_l[10];
int ary_r[10];
for (int i = 0;i<n1;i++)
{
ary_l[i] = a[p+i];
}
for (int j = 0;j<n2;j++)
{
ary_r[j] = a[q+1+j];
}
int i = 0;
int j = 0;
ary_l[n1] = ary_r[n2] = 100;
for (int k = p;  k<=r;k++ )
{
if (ary_l[i] <= ary_r[j])
{
a[k] = ary_l[i];
i = i + 1;

}
else
{
a[k] = ary_r[j];
j = j +1;
}
}
}
void Merge_sort(int ary[] ,int p , int r)
{
int q = (p+r)/2;
if (p < r)
{
Merge_sort(ary,p,q);
Merge_sort(ary,q+1,r);
Merge(ary,p,q,r);
}
}
int main() {

int a[8];
for (int i = 0;i<8;i++)
{
cin>>a[i];
}
int te=0;
Merge_sort(a,0,7);
cout<<a[0]<<a[1]<<a[2]<<a[3]<<a[4]<<a[5]<<a[6]<<a[7];
cin>>te;
return 0;
}


看到后面有个思考题,求一个数组的逆序数。提示用分而治之的思想。

个人觉得在 将Merge里面的else 加上一行 count += n1 - i + 1; 就可以了。

几百年没碰过C++了。当时纠结了C++的数组长度不能是变量,list,vector又不能直接赋值。迷茫中请教了一下同学。原来先申请一个足够大的数组就可以了。真的要变成小白了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: