【发布时间】:2021-11-14 22:45:02
【问题描述】:
我的合并排序代码给出了一些奇怪的结果。 那是: 4201675 7257888 7209152 23490 7257888 7257888 6.
我无法找到任何错误,因为它正在编译并给出不是我想要的结果。 它应该对给定的数组进行排序。
vsoce 建议的所有可能的错误都已修复。动态分配数组有什么问题吗? 谁能帮我写代码。
#include <iostream>
using namespace std;
void merge(int arr[], int si, int ei){
int size = ei - si + 1;
int mid = (ei + si) / 2;
int *out = new int[size];
int i = si, j = mid + 1, k = 0;
while(i<=mid && j<=ei){
if(arr[i]<=arr[j]){
out[k] = arr[i];
i++;
k++;
}
else{
out[k] = arr[j];
j++;
k++;
}
}
while(i<=mid){
out[k] = arr[i];
k++;
i++;
}
while(j<=ei){
out[k] = arr[i];
k++;
j++;
}
int m = 0;
for (int i = 0; i <=ei;i++){
arr[i] = out[m];
m++;
}
delete[] out;
}
void mergeSort(int arr[],int si,int ei){
if(si>=ei){
return;
}
int mid = (ei + si) / 2;
mergeSort(arr, si, mid);
mergeSort(arr, mid + 1, ei);
merge(arr, si, ei);
}
int main(){
int arr[] = {6, 5, 4, 3, 2, 1};
mergeSort(arr, 0, 6);
for (int i = 0; i <= 6;i++){
cout << arr[i] << " ";
}
return 0;
}
【问题讨论】:
-
首先调试一个失败的小例子。可以用笔和纸和一些 printf 语句来完成,看看会发生什么。
-
ei以 6 开头,比arr的末尾多一倍。您不应该尝试访问arr[ei]。但是merge就是这样做的 (j<=ei, arr[j])。 -
for (int i = 0; i <= 6;i++){也一样——你从六个数字开始,这个循环试图打印 7 -
您可能想自己澄清一下函数应该如何处理它们的参数 - 边界是否包含/排除?然后据此修改代码。
-
感谢您的帮助,但我想通了,您的解决方案不正确。但再次感谢。在合并函数的最后一个for循环中应该i=si,就是这样。
标签: c++ algorithm sorting data-structures mergesort