Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/azure/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 无法在C+中实现合并排序+;_C++_Algorithm_Mergesort - Fatal编程技术网

C++ 无法在C+中实现合并排序+;

C++ 无法在C+中实现合并排序+;,c++,algorithm,mergesort,C++,Algorithm,Mergesort,我是算法新手,我一直在尝试合并排序工作,但它不会给出正确的输出。没有编译错误,但我猜它只是在某个地方有缺陷,将输出中的随机值显示为排序数组 void merge_sort(int[], int, int); void merge(int[], int, int, int); void printarray(int[], int); int main() { int Arr[100], num_of_elements; cout << "Enter the numbe

我是算法新手,我一直在尝试合并排序工作,但它不会给出正确的输出。没有编译错误,但我猜它只是在某个地方有缺陷,将输出中的随机值显示为排序数组

void merge_sort(int[], int, int);
void merge(int[], int, int, int);
void printarray(int[], int);

int main() {
    int Arr[100], num_of_elements;
    cout << "Enter the number of elements (max 100): ";
    cin >> num_of_elements;
    cout << "Enter array elements: \n";
    for (int i = 0;i < num_of_elements;++i)
        cin >> Arr[i];
    merge_sort(Arr, 0, num_of_elements - 1);
    cout << "\nAfter Sorting (by Merge Sort):\n";
    printarray(Arr, num_of_elements);
    cout << endl;
    return 0;
}

void merge_sort(int arr[], int left, int right) {
    if (left < right) {
        int mid = (left + right) / 2;
        merge_sort(arr, left, mid);
        merge_sort(arr, mid + 1, right);
        merge(arr, left, mid, right);
    }  
}

void merge(int arr[], int left, int mid, int right) {
    int i, j, k;

    /* Calculate the lengths of the subarrays and copy the elements into them */
    int lenght_left = mid - left + 1;
    int length_right = right - mid;
    int *leftarray = new int[lenght_left];
    int *rightarray = new int[length_right];
    for (i = 0;i < lenght_left;++i)
        leftarray[i] = arr[left + i];
    for (j = 0;j < length_right;++j)
        rightarray[j] = arr[mid + 1 + j];

    /* Reordering the elements in the original array */
    for (k = left, i = 0, j = 0;k <= right;++k) {
        if (leftarray[i] <= rightarray[j])
            arr[k] = leftarray[i++];
        else
            arr[k] = rightarray[j++];
    }  

    /* Copy remaining elements into the array */
    while (i < lenght_left)
        arr[k] = leftarray[i++];
    while (j < length_right)
        arr[k] = rightarray[j++];
    delete[](leftarray);
    delete[](rightarray);
}

void printarray(int arr[], int num) {
    cout << "Displaying Elements in array: \n";
    for (int i = 0;i < num;i++)
        cout << arr[i] << "  ";
}
void merge_排序(int[],int,int);
无效合并(int[],int,int,int);
void printary(int[],int);
int main(){
int Arr[100],元素的数量;
cout>num\u元素;
cout>Arr[i];
合并元素排序(Arr,0,元素的数量-1);

cout在您的
合并功能中:

/* Reordering the elements in the original array */
for (k = left, i = 0, j = 0; k <= right; ++k) {
//                           ^^^^^^^^^^^
// It should be i < lenght_left && j < length_right
    if (leftarray[i] <= rightarray[j])
        arr[k] = leftarray[i++];
    else
        arr[k] = rightarray[j++];
}
/* Copy remaining elements into the array */
while (i < lenght_left)
    arr[k] = leftarray[i++];
//     ^^^
while (j < length_right)
    arr[k] = rightarray[j++];
//     ^^^

在这里,您忘记了递增
k
,将它们更改为
k++

您正在犯一些错误:

  • 在合并时,需要检查是否没有超过数组的长度

    即代替:

    for (k = left, i = 0, j = 0;k <= right;++k)
    

    用于(k=left,i=0,j=0;k当创建一个函数时,重要的是要真正完成它,并展示你的函数是如何使用的,你传递给它们的输入以及预期和实际的输出。另外,请。解决这些问题的正确工具是你的调试器。在询问堆栈O之前,你应该逐行检查你的代码verflow。有关更多帮助,请阅读。至少,您应该[编辑]您的问题将包括一个重现您的问题的示例,以及您在调试器中所做的观察。您所说的
    将输出中的随机值显示为排序数组是什么意思。
    ?您的意思是数组根本没有排序、被部分排序还是被垃圾数据填充?如果是最后一个,则您有一个内存问题(=>调试器)。您是否也可以向我们展示合并排序函数的调用(包括如何初始化数组并将其传递给函数)虽然这与你的问题没有多大关系,但是请学习如何在C++中正确地编写代码。你基本上是在C中编写代码,只是用<代码> CUT<代码> >代码> MalOC/ > <代码>新< /C> >,然后调用C++。这是如此错误的,在这么多的层次上。没有冒犯,只是个人建议,但是你确实应该学习正确的C++方法,比如使用向量、STL算法、模板等等。如果你想编写质量代码,这些是必不可少的。C++不是C.@ ADAM10603。我很欣赏这个建议,我现在正在学习C++,还没有得到模板和所有的东西。你能帮助我们参考一下链接吗?从哪里我可以赶上,变得更好,更C++?我很感激它:DySy.它工作。虽然我只是想知道为什么不检查I和J小于各自的长度。方法?你能回答吗?假设左边的部分是:10 11 12,右边的部分是1 2 3。然后你会在arr adn中加上10 11 12,你会检查左边数组的偏移量,它将超出边界。但是,就这个条件
    i
    
    for (k = left, i = 0, j = 0;k <= right && i <lenght_left && j<length_right;++k)
    
    while (i < lenght_left)
        arr[k] = leftarray[i++];
    while (j < length_right)
        arr[k] = rightarray[j++];
    
    while (i < lenght_left)
        arr[k++] = leftarray[i++];
    while (j < length_right)
        arr[k++] = rightarray[j++];