나는 종류의 모든 일 병합을 코딩했지만, 나는 그것이 작동하지 않는 이유를 알아낼 수 없습니다 :( 을 내가 무엇 이건 SIGSEGV라는이 여기 병합 정렬 SEGV, 배열 포인터가 사라지고 있습니까?
는 스택 추적입니다!#0 0x00401435 in tabLen (tab=0x1) at CodeBlocks\mergeSort.c:7
#1 0x004014d8 in mergeTabs (tab1=0x1, tab2=0x1) at CodeBlocks\mergeSort.c:26
#2 0x004016b3 in mergeSort (tab=0x3f1000, size=2) at CodeBlocks\mergeSort.c:51
#3 0x0040168b in mergeSort (tab=0x3f0fd8, size=3) at CodeBlocks\mergeSort.c:51
#4 0x0040168b in mergeSort (tab=0x3f2fb0, size=5) at CodeBlocks\mergeSort.c:51
#5 0x004013ea in main() at CodeBlocks\main.c:9
# 1과 # 2 사이
, 그것은 배열이 사라진 것처럼, 난 ... 왜
을 이해하지 않습니다 그리고 여기에 내가 시도 구현 :
int tabLen(int *tab)
{
int i = 0;
for (; tab && tab[i] && tab[i] != ENDTAB; ++i)
;
return i;
}
int *copy(int *tab, int beg, int end)
{
int size = end - beg + 1;
int *res = malloc(size * sizeof(int));
int i = beg;
for (; i < end; ++i)
res[i - beg] = tab[i];
res[i - beg] = ENDTAB;
return res;
}
int *mergeTabs(int *tab1, int *tab2)
{
int len1 = tabLen(tab1);
int len2 = tabLen(tab2);
int *res = malloc((len1 > len2) ? (len1+1) * sizeof(int) : (len2+1) * sizeof(int));
int i = 0;
int t1 = 0;
int t2 = 0;
printf("len1:%d | len2:%d\n", tabLen(tab1), tabLen(tab2));
for (; t1 < len1 && t2 < len2; ++i)
res[i] = (tab1[t1] < tab2[t2]) ? tab1[t1++] : tab2[t2++];
while (t1 < len1)
res[i++] = tab1[t1++];
while (t2 < len2)
res[i++] = tab2[t2++];
res[i] = ENDTAB;
return res;
}
int *mergeSort(int *tab, int size)
{
int *t1 = copy(tab, 0, size/2);
int *t2 = copy(tab, size/2, size);
if (tabLen(tab) <= 1)
return;
return mergeTabs(mergeSort(t1, tabLen(t1)), mergeSort(t2, tabLen(t2)));
}
아이디어가 있으십니까?
감사합니다, 플로리안 코드를 통해 빠른 검사에서
안녕하세요, 예 ENDTAB은 -1과 같습니다. – Florian