Я пытаюсь реализовать сортировку слиянием в C ++ 14. Я написал полный код и несколько раз корректировал его на наличие логических сбоев, но не могу его найти.Но код выводит неправильный отсортированный массив, который иногда даже содержит повторяющиеся элементы и / или элементы, которые никогда не вводились в массив в первую очередь.
Вот мой код:
#include <iostream>
#include <vector>
using std::cout;
using std::cin;
using std::endl;
using std::vector;
void merge_sort(vector<int>&, int, int);
void print_vector(vector<int>&);
void merge(vector<int>&, int, int, int);
int main() {
int arr_len = 0;
cout << "Enter the length of the array to be sorted: " << endl;
cin >> arr_len;
vector<int> arr(arr_len);
cout << "Enter the elements of the array: " << endl;
for (int i = 0; i < arr_len; i++) {
int buff;
cin >> buff;
arr[i] = buff;
}
cout << "The elements entered in the unsorted vector are: " << endl;
print_vector(arr);
merge_sort(arr, 0, arr_len - 1);
cout << "After Merge sorting, the elements in the vector are: " << endl;
print_vector(arr);
return 0;
}
void print_vector(vector<int>& arr) {
for (auto itr = arr.begin(); itr != arr.end(); ++itr) {
cout << *itr << " ";
}
cout << endl;
}
void merge_sort(vector<int>& arr, int low, int high) {
if (low < high) {
int mid = low + (high - low) / 2; // used this instead of (low + high) / 2 to avoid overflow problems
merge_sort(arr, low, mid); // recursive call to merge_sort with high = mid's updated value
merge_sort(arr, mid + 1, high);
merge(arr, low, mid, high); // call to merge to sort and merge the fragmented arrays.
}
}
void merge(vector<int>& arr, int low, int mid, int high) {
int l_arr_len = mid - low + 1;
int r_arr_len = high - mid;
vector<int> l_arr(l_arr_len);
vector<int> r_arr(r_arr_len);
for (int i = 0; i < l_arr_len; i++) { // initialise elements of temp_arr1 (l_arr) to 0.
l_arr[i] = 0;
}
for (int i = 0; i < r_arr_len; i++) { // initialise elements of temp_arr2 (r_arr) to 0.
r_arr[i] = 0;
}
for (int i = 0; i < l_arr_len; i++) { // transfer elements from arr to l_arr, upto length of the fragmented l_arr.
l_arr[i] = arr[low + i];
}
for (int i = 0; i < r_arr_len; i++) { // transfer remaining elements from arr to r_arr, upto length of the fragmented r_arr.
r_arr[i] = arr[mid + 1 + i];
}
int i = 0, j = 0, k = 0;
while (i < l_arr_len && j < r_arr_len) { // compare and replace elements in the mother array arr
if (l_arr[i] <= r_arr[j]) { // smallest element goes first
arr[k++] = l_arr[i++];
} else {
arr[k++] = r_arr[j++];
}
}
while (i < l_arr_len) { // write remaining elements in the left_arr fragment to mother array arr
arr[k++] = l_arr[i++];
}
while (j < r_arr_len) { // write remaining elements in the left_arr fragment to mother array arr
arr[k++] = r_arr[j++];
}
}
Длявходной массив элементов [2, 9, 4, 5, 7]
, правильный отсортированный результат был бы: [2, 4, 5, 7, 9]
.
Но моя реализация выводит: [5, 5, 7, 7, 9]
.Я не понимаю, откуда появились повторяющиеся элементы и почему они заменили оригинальные элементы.Несмотря на то, что я пытался добавить комментарии почти к заявлениям для облегчения доступа к SO-сообществу, некоторые из них могут быть избыточными.
Поскольку я не в себе, пожалуйста, помогите мне исправить мой код,Вы можете указать, что не так и где, если это то, что удобно.
Заранее спасибо!:)