簡體   English   中英

我的合並排序代碼出了什么問題

[英]What 's wrong with my merge sort code

我正在學習編碼,盡管我會嘗試編寫合並排序算法(我們在分析課程中聽說過的內容,但不是家庭作業)。 我正在使用培訓人員向我們展示的偽代碼進行工作,但我無法確定問題所在。 有人可以指出我正確的方向嗎?

#include <stdio.h>
#include <stdlib.h>
typedef int T;


void merge(T _elem[], int lo, int mi, int hi)
{
    int lb = mi - lo, lc = hi - mi;


    T* B = (T* )malloc(sizeof(T)*lb);

    for (int i = 0; i < lb; i++) B[i] = _elem[i];


    T* C = _elem + mi;


    for (int i = 0, j = 0, k = 0; j < lb || k < lc;)
    {
        if (j < lb && (lc <= k || B[j] <= C[k])) _elem[i++] = B[j++];
        if (k < lc && (lb <= j || C[k] < B[j])) _elem[i++] = C[k++];
    }
    free(B);
}

void mergeSort(T _elem[], int lo, int hi)
{
    if (hi - lo < 2) return;
    int mi = (lo + hi) >> 1;
    mergeSort(_elem, lo, mi);
    mergeSort(_elem, mi, hi);
    merge(_elem, lo, mi, hi);
}

int main()
{
    T elem[19] = {53, 130, 120, 14, 206, 31, 380, 39, 402, 146, 491, 51, 54, 59, 722, 79, 82, 186, 92};
    mergeSort(elem, 0, 19);
    for (int i = 0; i < 19; i++)
        printf("%d\t", elem[i]);
    return 0;
}

我看到此代碼有3個明顯的問題,但請記住,我只是在出門時就閱讀了它,沒有調試器。 您應該只調試它並查看。

  • 您的mergeSort()調用范圍重疊。 沒有理由對中間元素進行兩次排序,此外,您還希望盡快刪除元素並最終得到一個空集。
  • 當您填充B臨時數組時,您沒有正確地索引_elem ,應改為使用i+lo偏移。
  • 與上面相同,合並時您沒有正確索引_elem 您應該使用lo初始化i ,而不是始終從頭開始。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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