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

【排序算法】-归并排序

2016-07-07 19:38 225 查看
不赘述,上代码。环境:VS2010 C++ Win10 64位

void merge(int *data, int p, int q, int r)
{
int n1 = q - p + 1;
int n2 = r - q;
int n = r - p+1;
int *np1 = new int[n1];
int *np2 = new int[n2];
for (size_t i = 0; i < n1; i++)
np1[i] = data[i + p];
for (size_t i = 0; i < n2; i++)
np2[i] = data[i + q+1];
int p1 = 0,p2 = 0;
for (size_t i = 0; i < n; i++)
{
if (p1<n1&&p2<n2)
{
if (np1[p1]<np2[p2])
{
data[i+p] = np1[p1];
p1++;
}
else
{
data[i + p] = np2[p2];
p2++;
}
}else if (p1==n1)
{
for (; i < n; i++)
data[i + p] = np2[p2++];
}
else if (p2 == n2)
{
for (; i < n; i++)
data[i + p] = np1[p1++];
}
}
delete[] np1;
delete[] np2;
}
void mergeSort(int *data, int begin, int end)
{
if (begin<end)
{
int q = (int)(begin + end) / 2;
mergeSort(data, begin, q);
mergeSort(data, q + 1, end);
merge(data, begin, q, end);
}
}


总结算法特点:算法略微复杂,采用分治策略,将排序数据递归分割为小段,每段排序后归并成整体排序。时间复杂度低,最坏情况和最好情况以及平均情况均是O(nlog(n))。空间开销大,由于递归和创建拷贝数组,空间开销非常大。根据测试,由于使用了递归,小规模数据量下算法时间并不比插入、冒泡等简单算法速度快,在数据量增大后优势明显,具体测试结果稍后单独写一篇文章集中进行对比分析。算法稳定。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息