您的位置:首页 > 编程语言 > Go语言

Sorting Algorithm-Merging Sort

2016-09-04 10:33 218 查看
Merging Sort-归并排序

Algorithm:

    归并排序就是利用归并的思想实现排序的方法。它的原理是假设初始序列含有n个记录,则可以看成是n个有序的子序列,每个子序列的长度为1,然后两两归并,得到[n/2]([x]表示不小于x的最小整数)个长度为2或1的有序子序列;再两两归并,...,如此重复,直至得到一个长度为n的有序序列为止,这种排序方法称为2路归并排序。

Ex:



Code:

递归方式:自顶而下
void Merge(vector<int> &v,int first,int end)   //归并程序
{
int len = v.size();
vector<int> temp(len);
int mid = (first + end) >> 1;
int k = first;
int i = first;
int j = mid+1;
while (i<=mid&&j<=end)
{
if (v[i] <= v[j])
temp[k] = v[i++];
else
temp[k] = v[j++];
k++;
}
while (i <= mid)
{
temp[k++] = v[i++];
}
while (j <= end)
{
temp[k++] = v[j++];
}
for (k = first; k <= end; k++)
{
v[k] = temp[k];
}
}
void Merge_Sort(vector<int> &v, int first, int end)
{
if (first < end)
{
int mid = (first + end) >> 1;
Merge_Sort(v, first, mid);
Merge_Sort(v, mid + 1, end);
Merge(v, first, end);
}
}
非递归方式:用变量k记录二路合并的长度,直到k大于数组长度
void Merge(vector<int> &v,int first,int mid,int end)   //归并程序
{
int len = v.size();
vector<int> temp(len);
int k = first;
int i = first;
int j = mid+1;
while (i<=mid&&j<=end)
{
if (v[i] <= v[j])
temp[k] = v[i++];
else
temp[k] = v[j++];
k++;
}
while (i <= mid)
{
temp[k++] = v[i++];
}
while (j <= end)
{
temp[k++] = v[j++];
}
for (k = first; k <= end; k++)
{
v[k] = temp[k];
}
}
void Merge_Sort2(vector<int> &v, int first, int end)  //非递归
{
int k = 1;
while (k <= (end - first))
{
int l = first;
while (l <= end)
{
int mid = l + k-1;
int r = mid + k;
if (r > end)
r = end;
Merge(v, l,mid, r);
l = r + 1;
}
k = k*2;
}
}

Analysis:

        我们需要将序列中所有记录扫描一遍,因此耗费O(n)时间,整个归并排序需要进行log2n次,因此,总的时间复杂度为O(nlogn),而且这是归并排序算法中最好、最坏、平均时间性能。
由于归并排序在归并过程中需要与原始记录序列同样数量的存储空间存放归并结果以及递归时深度为log2n的栈空间,因此空间复杂度为O(n+logn)。
        归并排序市一种稳定的排序方法,总结来说,归并排序是一种比较占用内存,但却效率高且稳定的算法。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  归并排序