我试图通过免费的在线课程自学了算法和数据结构的基础知识,因此,尽管它在合并排序方面给了它第一眼。这并不是真的会用于任何事情,所以它非常草率,但我似乎遇到一个问题,其中main没有调用MergeSort函数。
输出为00000000,(我假设因为数组从未分配任何东西)。当我通过gdb运行程序时,程序似乎到达那一行,然后完全跳过该函数并直接进入打印数组的循环。
有什么想法?我错过了一些愚蠢的东西吗?
#include <iostream>
using namespace std;
int *MergeSort(int array[], int sizeOf);
int main(){
int numbers[8] = {5, 4, 1, 8, 7, 2, 6, 3};
int *array = MergeSort(numbers, 8);
for (int i = 0; i < 8; i++)
cout << array[i];
return 0;
}
int *MergeSort(int array[], int sizeOf){
int *leftArr = new int[sizeOf/2]; // Build arrays to split in half
int *rightArr = new int[sizeOf/2];
if (sizeOf < 2){ // Base case to end recursion
return array;
}
else{
for (int i = 0; i < (sizeOf/2); i++){ // Left gets first half
leftArr[i] = array[i];
}
int j = (sizeOf/2) - 1; // Set point to start building 2nd
for (int i = sizeOf; i >= (sizeOf/2); i--){
rightArr[j] = array[i]; // Build other half of array
j--;
}
leftArr = MergeSort(leftArr, sizeOf/2); // Call Recursive functions
rightArr = MergeSort(rightArr, sizeOf/2);
}
static int *newArray = new int[sizeOf]; // Sorted array to Build
int k = 0; // Iterators to build sorted func
int m = 0;
int p = 0;
while (p < sizeOf){
if (leftArr[k] < rightArr[m]){ // Left Arr's current value is less
newArray[p] = leftArr[k]; // right arr's current calue
k++;
}
else if (leftArr[k] >= rightArr[m]){
newArray[p] = rightArr[k];
m++;
}
p++;
}
//for (int i = 0; i < 8; i++)
// cout << newArray[i] << endl;
return newArray; // Return address to new array
}
答案 0 :(得分:1)
MergeSort()
:
newArray
static
。这意味着所有调用都使用相同静态变量的相同实例(并覆盖递归调用返回的实例)。 你需要通过使newArray非静态来解决这个问题。在函数结束时,您需要delete[]
递归调用返回的数组,以避免内存泄漏。