当前位置: 首页 > 知识库问答 >
问题:

我尝试实现合并排序,但无法找到我的代码的确切问题。程序没有显示错误,但我没有得到所需的输出

石超
2023-03-14

尝试实现合并排序,下面是代码。如果有什么问题,请告诉我。我的合并功能是否有任何错误?无法指出我的代码中的确切问题。任何关于相同的帮助将不胜感激。

#include <iostream>
using namespace std;

Merge函数用于合并两个排序的数组

void merge(int arr[], int start, int mid, int end) {
    int n1 = mid - start + 1;
    int n2 = end - mid;
    
    int arr1[n1], arr2[n2];
    for (int i = 0; i < n1; i++) {
        arr1[i] = arr[start + i];
    }
    for (int j = 0; j < n2; j++) {
        arr2[j] = arr[mid + 1 + j];
    }

    int i;
    int j;
    int p;
    i = 0;
    j = 0;
    p = start;
    
    while (i < n1 && j < n2) {
        if (arr1[i] <= arr2[j]) {
            arr[p] = arr1[i];
            i++;
        } else {
            arr[p] = arr2[j];
            j++;
        }
        p++;
    }
    while (i < n1) {
        arr[p] = arr1[i];
        i++;
        p++;
    }

    while (j < n2) {
        arr[p] = arr2[j];
        i++;
        p++;
    }
}

递归调用Mergesort

void merge_sort(int arr[], int start, int end) {
    if (start >= end) {
      return;
    }
    if (start < end) {
        int mid = start + (end - 1) / 2;
        merge_sort(arr, start, mid);
        merge_sort(arr, mid + 1, end);
        merge(arr, start, mid, end);
    }
}

打印函数来打印数组

void printArray(int arr[], int size) {
    for (int i = 0; i < size; i++)
        cout << arr[i] << " ";
    cout << endl;
}

主要功能

int main() {
    int arr[] = { 6, 5, 12, 10, 9, 1 };
    int n = sizeof(arr) / sizeof(arr[0]);
    
    merge_sort(arr, 0, n - 1);
    cout << "The sorted array is: " << endl;
    printArray(arr, n);
}

共有1个答案

杨飞
2023-03-14

代码中有两个错误:

> < li>

将中点计算为< code > int mid = start(end-1)/2;不正确。你应该写:

  int mid = start + (end - start) / 2;

在< code>merge的最后一个循环中,递增的是< code>i,而不是< code>j。注意,这个循环是多余的,因为< code>arr2的剩余元素已经在< code>arr的末尾。

您遵循mergesort实现中的经典约定,其中end是切片中最后一个元素的索引。此约定需要多次1/-1调整,很容易出错。

数组索引以0开头的C语言和相关语言中,使用不同的约定更为习惯:将开始作为切片的第一个元素的索引,将结束作为最后一个元素后面的索引。这允许指定空接头并生成更干净的代码。

这是修改后的版本:

#include <iostream>

using namespace std;

// Merge function to merge the two sorted arrays
void merge(int arr[], int start, int mid, int end) {
    int n1 = mid - start;
    int n2 = end - mid;
    int arr1[n1], arr2[n2];

    for (int i = 0; i < n1; i++) {
        arr1[i] = arr[start + i];
    }
    for (int j = 0; j < n2; j++) {
        arr2[j] = arr[mid + j];
    }

    int i = 0;
    int j = 0;
    int p = start;
    
    while (i < n1 && j < n2) {
        if (arr1[i] <= arr2[j]) {
            arr[p] = arr1[i];
            i++;
        } else {
            arr[p] = arr2[j];
            j++;
        }
        p++;
    }
    while (i < n1) {
        arr[p] = arr1[i];
        i++;
        p++;
    }
    // the remaining elements from `arr2` are already in place in `arr`
}

// Calling mergesort recursively
void merge_sort(int arr[], int start, int end) {
    if (end - start > 1) {
        int mid = start + (end - start) / 2;
        merge_sort(arr, start, mid);
        merge_sort(arr, mid, end);
        merge(arr, start, mid, end);
    }
}

// Print function to print the array
void printArray(const int arr[], int size) {
    for (int i = 0; i < size; i++)
        cout << arr[i] << " ";
    cout << endl;
}

// Main function
int main() {
    int arr[] = { 6, 5, 12, 10, 9, 1 };
    int n = sizeof(arr) / sizeof(arr[0]);
    
    merge_sort(arr, 0, n);
    cout << "The sorted array is: " << endl;
    printArray(arr, n);
    return 0;
}
 类似资料:
  • 我试图实现合并排序,但得到的输出是相同的数组。这种合并排序给了我与输入相同的输出。请帮忙。我很确定这个实现是正确的,我试着调试它,但没有发现错误。 解决:我在比较helper[左]和helper[中]而不是helper right。谢谢帮助的人。

  • 我在计算机课上遇到了合并排序的问题。我不断收到错误或返回原始ArrayList。 我相信合并排序涉及到将数组(列表)递归地对半拆分,直到只剩下一个元素,然后从这些单独的元素开始,按排序顺序合并它们。直到数组(列表)被排序为止。至于实际的排序部分,我试图在新的ArrayList中插入两半之间的较高值,直到它们都为空,在这种情况下,填充的ArrayList现在被排序。 这是我当前的代码: 我将感谢任何

  • 这是密码。 我还没有真正为机器人实现任何命令,但我只是好奇为什么它不能工作以及如何修复它。

  • 我的任务是创建一个名为MyRectangle的类来表示矩形。 所需的数据字段是宽度、高度和颜色。宽度和高度使用双数据类型,颜色使用字符串。然后编写一个程序来测试MyRectangle类。在客户端程序中,创建两个MyRectangle对象。为两个对象中的每一个指定宽度和高度。将第一个对象指定为红色,将第二个对象指定为黄色。显示两个对象的所有属性,包括其面积。 我已经写了所有的东西,没有错误,但是无论

  • 更新2 在较新版本的Sprint Boot上再次遇到此问题,不得不改为: