简体   繁体   中英

Getting error in Merge sort. Can somebody help me out finding error?

I am trying to do merge sort in SIMPLER WAY but not getting desired output. It is showing me some loop is iterating infinitely. Will anyone help me out finding where is the error in code?

#include <bits/stdc++.h>

void merge(int arr[], int, int, int);
void mergesort(int arr[], int, int);

using namespace std;

int main() {
    int n, m;
    cin >> n;
    int arr[n]; 
    for (int i = 0; i < n; i++)
        cin >> arr[i];
    mergesort(arr, 0, n);
    for (int i = 0; i < n; i++)
        cout << arr[i] << " ";
}

void merge(int arr[], int l, int mid, int h) {
    int i = l, j = mid, k = 0;
    int brr[h - l];

    while (i < mid && j < h) {
        if (arr[i] <= arr[j])
            brr[k++] = arr[i++];
        else
            brr[k++] = arr[j++];
    }
    for(; i < mid; i++)
        brr[k++] = arr[i];
    for(; j < h; j++)
        brr[k++] = arr[j];
    
    int i = 0;
    for(k = l; k < h; k++)
        arr[k] = brr[i++];
}

void mergesort(int arr[], int l, int h) {
    if (l < h) {
        int mid = l + (h - l) / 2;
        mergesort(arr, l, mid);
        mergesort(arr, mid, h);
        merge(arr, l, mid, h);
    }
}

The algorithm is correct except the test in mergesort : if (l < h) should be if (h - l >= 2)

The test l < h is used in when h is the index of the last element in the slice. It is much simpler and more idiomatic in C and C++ to consider h to be an excluded upper bound. Hence the minimal slice to split in mergesort must have a length of at least 2: h - l >= 2 .

Note that allocating the arrays as VLAs is risky for large arrays: it may cause a stack overflow . C++ does not support VLAs (variable length arrays, ie automatic arrays whose size is not a compile time expression), your compiler supports them as an extension.

Note also that the last for loop in merge can be omitted as the elements it copies are already in the proper position.

Here is a modified version:

#include <bits/stdc++.h>

void merge(int arr[], int, int, int);
void mergesort(int arr[], int, int);

using namespace std;

int main() {
    int n, m;
    cin >> n;
    int arr[n]; 
    for (int i = 0; i < n; i++)
        cin >> arr[i];
    mergesort(arr, 0, n);
    for (int i = 0; i < n; i++)
        cout << arr[i] << " ";
    cout << endl;
    return 0;
}

void merge(int arr[], int l, int mid, int h) {
    int i = l, j = mid, k = 0;
    int brr[h - l];

    while (i < mid && j < h) {
        if (arr[i] <= arr[j])
            brr[k++] = arr[i++];
        else
            brr[k++] = arr[j++];
    }
    for(; i < mid; i++)
        brr[k++] = arr[i];
    
    for(i = 0, k = l; k < j; k++, i++)
        arr[k] = brr[i];
}

void mergesort(int arr[], int l, int h) {
    if (h - l >= 2) {
        int mid = l + (h - l) / 2;
        mergesort(arr, l, mid);
        mergesort(arr, mid, h);
        merge(arr, l, mid, h);
    }
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM