[英]Why does this merge sort algorithm not work properly?
我沒有收到錯誤或警告。 這是我的代碼:
#include <iostream>
void merge(int arr[], int l, int m, int r);
void mergeSort(int arr[], int l, int r);
int main(){
int arr[11] = {1, 9, 2, 5, 3, 10, 4, 8, 6, 7};
mergeSort(arr, 0, 10);
for(int i = 0; i < 11; i++){
std::cout << arr[i] << "\t";
}
return 0;
}
void merge(int arr[], int l, int m, int r){
int i = l; // starting point of left subarray
int j = m + 1; // starting point of right subarray
int k = l; // starting point of temporary array
int temp[11];
while(i <= m && j <= r){
if(arr[i] <= arr[j]){
temp[k] = arr[i];
i++;
} else {
temp[k] = arr[j];
j++;
}
k++;
}
while(i <= m){
temp[k] = arr[i];
k++; i++;
}
while(j <= r){
temp[k] = arr[j];
k++; j++;
}
for(int s = l; s < 11; s++){
arr[s] = temp[s];
}
}
void mergeSort(int arr[], int l, int r){
if(l < r) {
int m = (l + r) / 2; // middle
mergeSort(arr, l, m); // left subarray
mergeSort(arr, m + 1, r); // right subarray
merge(arr, l, m, r);
}
}
這是我編譯和運行時得到的:
0 1 2 3 4 9 4199851 7208472 7667712 7669136 1996860265
似乎左側部分已排序 - 盡管原始數組中沒有 0,然后一切都亂七八糟,右側部分都是廢話。
如果有人可以幫助我,我將不勝感激-謝謝。
問題在於合並功能。 你必須循環遍歷l
到r
,不inclusive
11
。 請參閱參考代碼以更好地理解。
參考代碼
#include <iostream>
void merge(int arr[], int l, int m, int r);
void mergeSort(int arr[], int l, int r);
int main(){
int arr[11] = {1, 9, 2, 5, 3, 10, 4, 8, 6, 7};
mergeSort(arr, 0, 10);
for(int i = 0; i < 11; i++){
std::cout << arr[i] << "\t";
}
return 0;
}
void merge(int arr[], int l, int m, int r){
int i = l; // starting point of left subarray
int j = m + 1; // starting point of right subarray
int k = l; // starting point of temporary array
int temp[11];
while(i <= m && j <= r){
if(arr[i] <= arr[j]){
temp[k] = arr[i];
i++;
} else {
temp[k] = arr[j];
j++;
}
k++;
}
while(i <= m){
temp[k] = arr[i];
k++; i++;
}
while(j <= r){
temp[k] = arr[j];
k++; j++;
}
for(int s = l; s <= r; s++){
arr[s] = temp[s];
}
}
void mergeSort(int arr[], int l, int r){
if(l < r) {
int m = (l + r) / 2; // middle
mergeSort(arr, l, m); // left subarray
mergeSort(arr, m + 1, r); // right subarray
merge(arr, l, m, r);
}
}
輸出
0 1 2 3 4 5 6 7 8 9 10
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.