使用矢量合并排序(int)C++
Merge Sort Using Vectors (int) C++
我似乎不知道我的代码出了什么问题。正如标题所说,我正在尝试使用整数向量实现合并排序。
标头:
using Val = int;
using Container = std::vector<Val>;
using Iter = long;
void mergeSort(Container& arr, Iter start, Iter end);
.CPP(我已经在文件中包含了合并的定义,只是这里没有图片)
void mergeSort(Container& arr, Iter start, Iter end) {
if (start >= end) return;
int mid = (start + end) / 2;
mergeSort(arr, start, mid);
mergeSort(arr, mid + 1, end);
merge(arr, start, end, mid);
}
void merge(Container& arr, Iter start, Iter end, Iter mid)
{
int len = end - start + 1;
int x = 0;
Container temp;
temp.resize(arr.size());
int i, j, k;
i = start;
k = start;
j = mid + 1;
while (i <= mid && j <= end)
{
if (arr[i] < arr[j])
{
temp[k++] = arr[i++];
}
else
{
temp[k++] = arr[j++];
}
}
while (i <= mid) temp[k++] = arr[i++];
while (j <= end) temp[k++] = arr[j++];
for (k = 0; k < len; k++) arr[k + start] = temp[k];
}
非常感谢!
我认为您的代码可能有四个问题。
- 假设序列
<start,mid>
和<mid+1,end>
已排序。如果这个条件不成立(例如{6,5,7,4}
上的merge(v,0,3,2)
),则算法将给出不正确的结果 - 使用函数时使用了不正确的
end
值(例如,数组{6,5,7,4}
上的merge(v,0,4,2)
。您总是必须迭代<0,size-1>
- 如前所述,k应始终初始化为0。您希望将已排序的序列插入到已排序数组的开头
- 假设参数mid是数组中元素的
index
,而不是position
。例如,merge(v,0,3,2)
会在{1,6,2,4}
上产生不正确的结果,因为在函数中,您将序列从索引mid+1=2+1=3
排序到仅包含{4}
的3
。因此,您的第一部分{1,6,2}
没有排序,这是您的算法所要求的
解决方案是:
- 将k初始化为0
- 检查
mid<end
- 使用另一种排序算法对
<0,mid>
和<mid+1,end>
进行排序
只看您的代码,我认为有一个问题是merge
函数中k
的初始值。
如果将temp值从位置0
开始放入Container temp
,则应将k
初始化为0
k = 0;
或者,如果您希望位置从start
开始,则需要将最后一个for
循环更改为
for (k = start; k <= end; k++) arr[k] = temp[k];
但是,请发布有关您遇到的问题的更多信息。。这是编译错误吗?还是运行时错误?或者结果与你的预期不符?此外,展示您为解决问题所做的工作:)
相关文章:
- 为什么在全局范围内使用"extern int a"似乎不行?
- int(c) 和 c-'0' 之间的区别。C++
- 从"int*"强制转换为"unsigned int"会丢失精度错误
- 为什么野牛仍在使用"int yylex(void)",却找不到"int yylex(YYS
- 有符号的int和int-有没有一种方法可以在C++中区分它们
- 请解释这句话(cout<<1+int((a<b)^((b-a)&1) )<<endl
- 是否可以从int转换为enum类类型
- 不能在初始值设定项列表中将非常量表达式从类型 'int' 缩小到'unsigned long long'
- 向量 <int> a {N, 0} 和 int arr a[N] = {0} 的时间复杂度有什么区别
- 'short int'持有的值溢出,但"自动"不会溢出?
- 如何在C++中将一个无符号的 int 转换为两个无符号的短裤?
- 调用'begin(int [n])'没有匹配函数
- 没有显式声明的int[]中的foreach
- 在c++中访问int到类对象的映射时出错
- 为什么我无法更改"set<set>"循环中的值<int>
- 长 长 int 不要 长 int 好
- C++程序在循环后给出奇怪的int值
- 如何计算数据类型的范围,例如int
- 如果"new int"返回"int*",那么为什么"new int[n]"不返回"int**"?
- 如何在cpp.中使用协议缓冲区存储大缓冲区/数组(char/int)