【发布时间】:2019-07-23 18:37:42
【问题描述】:
我有以下实现归并排序的函数:
第一个函数是merge函数,第二个函数是mergeSort函数。
如输出所示,当数组 [-3,8] 进入合并函数时,它似乎被反转为 [8,-3],从而无法进行排序。
输入数组是int array[5] = {37, 45, 29, 8, -3};
预期的输出将是:Sorted Array: -3 8 29 27 45
...
合并:... ||arr1: 8 || arr2:-3 -------- 新:-------- -3 8
合并:... ||arr1: 29 || arr2:8 -3 -------- 新:-------- 8 -3 29
合并:... ||arr1: 37 45 || arr2:29 8 -3 -------- 新:-------- 29 8 -3 37 45
排序数组:29 8 -3 37 45
合并:
int * ArraySort::merge(int arr1[], int arr1_size, int arr2[], int arr2_size){
std::cout<<"\nMerging: ... ";
int * new_array = new int [arr1_size+arr2_size];
int i = 0, j = 0, k = 0;
std::cout<<"||arr1: ";
for(int i=0;i<arr1_size;i++)
std::cout<<arr1[i]<<" ";
std::cout<<"|| arr2: ";
for(int i=0;i<arr2_size;i++)
std::cout<<arr2[i]<<" ";
while(i<arr1_size && j<arr2_size){
if(arr1[i] < arr2[j]){
new_array[k++] = arr1[i++];
}
else{
new_array[k++] = arr2[j++];
}
}
// Clean up
while(i<arr1_size){
new_array[k++] = arr1[i++];
}
while(j<arr2_size){
new_array[k++] = arr2[j++];
}
std::cout<<"\n -------- NEW: -------- ";
for(int i=0;i<arr1_size+arr2_size;i++)
std::cout<<new_array[i]<<" ";
std::cout<<"\n";
return new_array;
}
合并排序:
int * ArraySort::mergeSort(int * arr, int size){
std::cout<<"\n\nMerge Sort...\n";
std::cout<<"ON: ";
for(int i=0;i<size;i++){
std::cout<<arr[i]<<" ";
}
if(size == 1)
return arr;
int mid = size/2;
std::cout<<"\nMid:"<<mid;
int * left = new int[mid];
int * right = new int [size-mid];
std::cout<<"\nLEFT: ";
for(int i=0;i<mid;i++){
left[i] = arr[i];
std::cout<<left[i]<<" ";
}
std::cout<<"\nRIGHT: ";
for(int i=mid;i<size;i++){
right[i-mid] = arr[i];
std::cout<<right[i-mid]<<" ";
}
mergeSort(left, mid);
mergeSort(right, size-mid);
return merge(left, mid, right, size-mid);
}
【问题讨论】:
-
请不要发布图片!您可以将该文本复制到代码块中吗?另外,您的输入、预期输出和实际输出是多少?你做了什么调试,你发现问题出在哪里?
-
听起来您可能需要学习如何使用调试器来单步调试您的代码。使用好的调试器,您可以逐行执行您的程序,并查看它与您期望的偏差在哪里。如果您要进行任何编程,这是必不可少的工具。进一步阅读:How to debug small programs 和 Debugging Guide
-
我看到的
news 比deletes多,你可能想解决这个问题。最好的解决办法是使用std::vector -
@scohe001谢谢你的建议。我将您的建议应用于该问题。问题发生在数组 [-3,8] 即将合并数组 [29] 时。数组 [-3,8] 作为 [8,-3] 发送,导致合并失败。
标签: c++ arrays sorting merge mergesort