簡體   English   中英

為什么這個歸並排序算法不能正常工作?

[英]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,然后一切都亂七八糟,右側部分都是廢話。

如果有人可以幫助我,我將不勝感激-謝謝。

問題在於合並功能。 你必須循環遍歷lr ,不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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM