【发布时间】:2021-04-29 06:09:06
【问题描述】:
谁能告诉我这段代码有什么问题?这段代码是使用归并排序对数组中的一组元素进行排序。
#include<iostream>
void merge(int arr[], int left, int mid, int right){
int left_ptr = left;
int right_ptr = mid + 1;
int size = right - left + 1;
int temp[size];
int k = left;
while (left_ptr <= mid && right_ptr <= right)
{
if(arr[left_ptr] <= arr[right_ptr]){
temp[k] = arr[left_ptr];
left_ptr++;
k++;
}
else{
temp[k] = arr[right_ptr];
right_ptr++;
k++;
}
}
while (left_ptr <= mid)
{
temp[k] = arr[left_ptr];
left_ptr++;
k++;
}
while (right_ptr <= right)
{
temp[k] = arr[right_ptr];
right_ptr++;
k++;
}
for (int i = left_ptr; i < k; i++)
{
arr[i] = temp[i];
}
}
void mergeSort(int arr[], int left, int right){
int mid;
if (left < right)
{
mid = (right + left)/2;
mergeSort(arr, left, mid);
mergeSort(arr, mid + 1, right);
merge(arr, left, mid, right);
}
}
int main(){
int arr[] = {45,8,9,7,4,58,2,34,2,58};
std::cout << arr << std::endl;
int size = sizeof(arr)/sizeof(int);
mergeSort(arr, 0, size - 1);
for (int i = 0; i < size; i++)
{
std::cout << arr[i] << " ";
}
std::cout << std::endl;
}
我用许多在线代码仔细检查了它,我没有发现任何错误......你认为哪里出了问题?我尝试使用就地数组(类似于快速排序)来实现这一点。
【问题讨论】:
-
如果您使用额外的数组进行合并然后将其复制回来,则它不是“就地”。
-
使用小而系统的测试用例,而不是大而随意的测试用例。例如,
{1,0}给出输出“1 1”,{2,1,0}给出“2 2 2”。这些足够小,您可以手动跟踪您的代码并查看哪里出错了。 -
作为旁注,传统的半开间隔是传统的,因为它们更容易编程并且更难消除一个错误。熟悉它们是个好主意,因为当您遇到标准库和其他非初学者代码时,您会看到它们。
标签: c++ algorithm sorting c++11 mergesort