【问题标题】:Why does my merge sort code not giving me desired results? what's wrong with my code?为什么我的合并排序代码没有给我想要的结果?我的代码有什么问题?
【发布时间】:2021-11-14 22:45:02
【问题描述】:

我的合并排序代码给出了一些奇怪的结果。 那是: 4201675 7257888 7209152 23490 7257888 7257888 6.

我无法找到任何错误,因为它正在编译并给出不是我想要的结果。 它应该对给定的数组进行排序。

vsoce 建议的所有可能的错误都已修复。动态分配数组有什么问题吗? 谁能帮我写代码。

#include <iostream>
using namespace std;

void merge(int arr[], int si, int ei){
    int size = ei - si + 1;
    int mid = (ei + si) / 2;

    int *out = new int[size];
    int i = si, j = mid + 1, k = 0;

    while(i<=mid && j<=ei){
        if(arr[i]<=arr[j]){
            out[k] = arr[i];
            i++;
            k++;
        }
        else{
            out[k] = arr[j];
            j++;
            k++;
        }        
    }
    while(i<=mid){
        out[k] = arr[i];
        k++;
        i++;
    }
    while(j<=ei){
        out[k] = arr[i];
        k++;
        j++;
    }

    int m = 0;
    for (int i = 0; i <=ei;i++){
        arr[i] = out[m];
        m++;
    }

    delete[] out;
}

void mergeSort(int arr[],int si,int ei){
    if(si>=ei){
        return;
    }

    int mid = (ei + si) / 2;
    mergeSort(arr, si, mid);
    mergeSort(arr, mid + 1, ei);
    merge(arr, si, ei);
}

int main(){

    int arr[] = {6, 5, 4, 3, 2, 1};

    mergeSort(arr, 0, 6);

    for (int i = 0; i <= 6;i++){
        cout << arr[i] << " ";
    }

        return 0;
}

【问题讨论】:

  • 首先调试一个失败的小例子。可以用笔和纸和一些 printf 语句来完成,看看会发生什么。
  • ei 以 6 开头,比 arr 的末尾多一倍。您不应该尝试访问arr[ei]。但是merge 就是这样做的 (j&lt;=ei, arr[j])。
  • for (int i = 0; i &lt;= 6;i++){ 也一样——你从六个数字开始,这个循环试图打印 7
  • 您可能想自己澄清一下函数应该如何处理它们的参数 - 边界是否包含/排除?然后据此修改代码。
  • 感谢您的帮助,但我想通了,您的解决方案不正确。但再次感谢。在合并函数的最后一个for循环中应该i=si,就是这样。

标签: c++ algorithm sorting data-structures mergesort


【解决方案1】:

我想通了,您的解决方案不正确。但再次感谢。应该是i=si,在merge函数的最后一个for循环中,就是这样。

#include <bits/stdc++.h>
using namespace std;

void merge(int arr[],int si,int ei){

    int size = ei - si + 1;
    int mid = (ei + si) / 2;
    int *out = new int[size];

    int k = 0, i = si, j = mid + 1;
    while(i<=mid && j<=ei){
        if(arr[i]<=arr[j]){
            out[k] = arr[i];
            i++;
            k++;
        }
        else{
            out[k] = arr[j];
            k++;
            j++;
        }
    }

    while(i<=mid){
        out[k] = arr[i];
        k++;
        i++;
    }
    while(j<=ei){
        out[k] = arr[j];
        k++;
        j++;
    }

    int m = 0;
    for (int x = si; x <= ei;x++){
        arr[x] = out[m];
        m++;
    }

    delete[] out;
}

void mergeSort(int arr[],int si,int ei){
    if(si>=ei){
        return;
    }
    int mid = (ei + si) / 2;
    mergeSort(arr, si, mid);
    mergeSort(arr, mid + 1, ei);

    merge(arr, si, ei);
}

int main(){

    int arr[] = {6, 5, 4, 3, 2, 1};
    mergeSort(arr, 0, 6);

    for (int i = 0; i < 6;i++){
        cout << arr[i] << " ";
    }

        return 0;
}

【讨论】:

    猜你喜欢
    • 2016-03-18
    • 2021-07-14
    • 2023-03-27
    • 2023-04-10
    • 2011-07-28
    相关资源
    最近更新 更多