[英]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.