使用C++合并排序实现
Merge Sort Implementation using C++
我在尝试实现合并排序算法时遇到问题。如果有人能帮助我,我将不胜感激。这是我所拥有的。
#include <iostream>
#include <deque>
using size_type = std::deque<int>::size_type;
void print(std::deque<int> &v)
{
for(const auto &ref:v)
std::cout << ref << " ";
std::cout << std::endl;
}
void merge(std::deque<int> &vec, size_type p, size_type q, size_type r)
{
int n_1 = q - p;
int n_2 = r - q;
std::deque<int> left, right;
for(auto i = 0; i != n_1; i++)
left.push_back(vec[p + i]);
for(auto j = 0; j != n_2; j++)
right.push_back(vec[q + j]);
int i = 0, j = 0;
std::cout << "left = ";
print(left);
std::cout << "right = ";
print(right);
for(auto k = p; k != r; k++) {
if(i < n_1 && left[i] <= right[j]) {
vec[k] = left[i];
i++;
}
else if(j < n_2){
vec[k] = right[j];
j++;
}
}
}
void merge_sort(std::deque<int> &A, size_type p, size_type 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()
{
std::deque<int> small_vec = {1, 6, 2, 10, 5, 2, 12, 6};
std::deque<int> samp_vec = {2, 9, 482, 72, 42, 3, 4, 9, 8, 73, 8, 0, 98, 72, 473, 72, 3, 4, 9, 7, 6, 5, 6953, 583};
print(small_vec);
merge_sort(small_vec, 0, small_vec.size());
print(small_vec);
return 0;
}
该程序的输出为:
left =
right = 1
left = 1
right = 6
left =
right = 10
left = 1 6
right = 2 10
left =
right = 2
left =
right = 6
left = 2
right = 12 6
left = 1 2 6 10
right = 5 2 12 6
1 2 5 2 6 10 12 6
您的排序存在一些问题。首先,合并步骤是错误的。其次,你如何称呼合并是错误的。我建议几个步骤来改进实施以获得正确的解决方案,也许它会帮助你。
首先我的合并代码:
void merge(std::deque<int> &vec, size_type p, size_type q, size_type r)
{
std::deque<int> left, right;
int i = p, j = q+1;
while(i <= q) //change 1: to a while loop. expresses it a little simpler but
//you weren't inserting the correct left elements here
left.push_back(vec[i++]);
while(j <= r) //change 2: same thing, lets get the correct right values
right.push_back(vec[j++]);
i = 0; j = 0;
for(auto k = p; k <= r; k++) {
//change 3: alter this case to include the left over left elements! this is the main error
if(i < left.size() && left[i] <= right[j] || j >= right.size())
vec[k] = left[i++];
else if(j < right.size())
vec[k] = right[j++];
}
}
然后,要更改对merge_sort的调用方式,请执行以下操作:
merge_sort(small_vec, 0, small_vec.size()-1); //change 4: initialized r wrong
这使得排序对我有用。作为对问题的回顾,我发现:1)没有抓住左右的正确子数组。2)没有正确处理合并 - 右边消失后忘记抓取所有左侧元素。3) 未正确调用merg_sort,错误地初始化了 r 参数。
相关文章:
- 这是插入排序的正确实现吗?
- 如何修复我的快速排序实现?
- 为什么在排序链表上的这种合并实现总是将两个列表都设置为 NULL,而只有一个应该设置一个列表?
- 分段 排序函数实现中的错误
- 使用向量在 c++ 中合并排序实现
- 我无法让我的合并排序实现运行
- 为什么在此排序算法实现中,向量明显比数组慢?
- 如何在C++中实现气泡排序?
- 比较迭代器会使程序崩溃,而不会在自定义气泡排序实现中出现错误
- 在实现合并排序代码时无法计算所有反转
- 实现 3 路分区以实现快速排序
- 为什么这个快速排序实现给出了一个奇怪的输出
- 当给出预先排序的输入时,为什么我的快速排序实现很慢
- 定制比较器,用于使用多种排序键来实现排序
- 如何实现排序的指针向量
- 使用模板实现排序.如何使用比较器
- 使用模板实现排序类
- 实现排序的双向链表的困难
- 成员函数的实现:排序算法
- 使用 3 个堆栈实现排序.(分段错误 - 核心转储)