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.