gpt4 book ai didi

c++ - 归并排序算法辅助

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:47:39 25 4
gpt4 key购买 nike

我正在尝试实现合并排序算法。我从算法书中提供的伪代码开始。伪代码将数组中的第一个位置指示为 1 而不是 0。我在尝试实现代码时遇到了非常困难的时间。

这是我的。我尝试通过打印出每一步的结果来逐步完成递归,但此时它非常复杂。

#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 && j != n_2) && 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 - 1) {
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 = 1 
right = 6
left = 1 6
right = 2 10
left = 2
right = 12 6
left = 1 2 6 10
right = 5 2 12 6
1 2 5 2 6 10 12 6

最佳答案

错误在这里:(i != n_1 && j != n_2) && left[i] <= right[j])什么时候i != n_1计算结果为假 vec[k] = right[j];被执行 - 正确。

但是如果i != n_1评估为 truej != n_2假即j = n_2你的程序试图这样做 vec[k] = right[j];再次,即访问你的双端队列的边界。

按如下方式重写您的 for 循环: if (i<n_1 && (j>=n_2 || left[i] <= right[j])此循环仅由于 C++ 的条件短路才起作用,即当 j>=n_2 时评估为 true , left[i] <= right[j]永远不会再次检查,并且您不会越界访问双端队列。

left[i] <= right[j]仅在同时检查 i<n_1 时才检查是真的 j>=n_2 false 否则执行第二个分支。

关于c++ - 归并排序算法辅助,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18806333/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com