c++ - 合并排序 C++ 不排序
问题描述
我正在学习算法第一部分课程,我使用 C++ 实现了归并排序。它应该进行就地排序,但它不对数组进行排序。我无法找到原因。希望能得到积极的回应。谢谢你。
void merge(int *a, int *aux, int low, int mid, int high) {
for (int k = low; k <= high; ++k)
aux[k] = a[k]; // copy
int i = low, j = mid + 1;
for (int k = low; k <= high; ++k) { // merge
if (i > mid)
a[k] = aux[j++];
else if (j > mid)
a[k] = aux[i++];
else if (aux[i] > aux[j])
a[k] = aux[j++];
else
a[k] = aux[i++];
}
}
void sort(int *a, int *aux, int low, int high) {
if (high <= low)
return;
int mid = low + (high - low) / 2;
sort(a, aux, low, mid);
sort(a, aux, mid + 1, high);
merge(a, aux, low, mid, high);
}
void sort(int *a, int N) {
int *aux = new int[N];
sort(a, aux, 0, N - 1);
}
解决方案
您的合并功能在逻辑上不正确。对于任何迭代,最后两个条件将永远不会被执行。j
将始终大于mid
,控制不会超出第二个表达式。
将合并函数的定义修改为如下所示:
void merge(int *a, int *aux, int low, int mid, int high) {
for (int k = low; k <= high; ++k)
aux[k] = a[k]; // copy
int i = low, j = mid + 1;
for (int k = low; k <= high; ++k) { // merge
// changes begin here
if (i <= mid and j <= high) {
if (aux[i] > aux[j])
a[k] = aux[j++];
else
a[k] = aux[i++];
}
else if (i > mid)
a[k] = aux[j++];
else // if (j > high)
a[k] = aux[i++];
// changes end here
}
}
推荐阅读
- c++ - 迭代检查实例是否属于特定变体的模板包
- python - 使用 Tortoise-ORM 在 FastAPI 中进行测试
- kubernetes - kubectl 命令查找特定 pod 状态为就绪
- php - 在 CodeIgniter 模型中打印变量值(基础)
- mysql - 搜索 NULL 值时加入性能
- node.js - 可以将“npm”安装为依赖项吗?
- java - java中二分查找的实现
- java - 使用 Junit 5、Java 11 的 EnabledOnOs/DisabledOnOs 标签不排除测试
- angular - NX工作空间:生成新lib时配置.eslintrc.json的模板
- r - 4chan:找不到带有 xml_find_all 和 rvest 的节点