私は現在、かなり標準のマージソートファイルで作業していますが、いくつかの問題があります。私はデータ構造をかなり新しくしているので、何が起こっているのかを完全に理解していない。どんなヒントもいいだろう。ありがとう。標準のMergeSortアルゴリズム
typedef struct CELL *LIST;
struct CELL {
int element;
LIST next;
}
代わりにこれを試してみてください:ここで
はコード#include <stdio.h>
#include <stdlib.h>
typedef struct CELL *LIST;
struct CELL {
int element;
LIST next;
}
LIST merge(LIST list1, LIST list2);
LIST split(LIST list);
LIST MergeSort(LIST list);
LIST MakeList();
void PrintList(LIST list);
int main()
{
LIST list;
list = MakeList();
PrintList(MergeSort(list));
}
LIST MakeList()
{
int x;
LIST pNewCell;
if(scanf("%d", &x) == EOF) return NULL;
else {
pNewCell = (LIST) malloc(sizeof(struct CELL));
pNewCell->next = MakeList();
pNewCell->element = x;
return pNewCell;
}
}
void PrintList(LIST list)
{
while(list != NULL) {
printf("%d\n", list->element);
list = list->next;
}
}
LIST MergeSort(LIST list)
{
LIST SecondList;
if (list == NULL) return NULL;
else if (list->next == NULL) return list;
else {
SecondList = split(list);
return merge(MergeSort(list), MergeSort(SecondList));
}
}
LIST merge(LIST list1, LIST list2)
{
if (list1 == NULL) return list2;
else if(list2 == NULL) return list1;
else if(list1->element <= list2->element){
list1->next = merge(list1->next, list2);
return list1;
}
else {
list2->next = merge(list1, list2->next);
return list2;
}
}
LIST split(LIST list)
{
LIST pSecondCell;
if (list == NULL) return NULL;
else if (list->next == NULL) return NULL;
else {
pSecondCell = list->next;
list->next = pSecondCell->next;
pSecondCell->next = split(pSecondCell->next);
return pSecondCell;
}
}
そして、私は(複数のプラットフォーム上)を取得
prog.c:10:6: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘merge’
LIST merge(LIST list1, LIST list2);
^~~~~
prog.c: In function ‘MergeSort’:
prog.c:53:16: warning: implicit declaration of function ‘merge’ [-Wimplicit-function-declaration]
return merge(MergeSort(list), MergeSort(SecondList));
^~~~~
prog.c:53:16: warning: return makes pointer from integer without a cast [-Wint-conversion]
return merge(MergeSort(list), MergeSort(SecondList));
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
prog.c: At top level:
prog.c:57:6: error: conflicting types for ‘merge’
LIST merge(LIST list1, LIST list2)
^~~~~
prog.c:53:16: note: previous implicit declaration of ‘merge’ was here
return merge(MergeSort(list), MergeSort(SecondList));
^~~~~
再帰的なマージは、学習上の問題ではなくO(n)のスタック領域を占有しますが、大きなリストでは問題になります。もし興味があれば、同じmerge()関数を使用しますが、リストを使用していますが、[リストのボトムアップマージソート - wikiの例](http://en.wikipedia.org/wiki/Merge_sort#Bottom-up_implementation_using_lists)一時的なリストを分割する代わりに格納するノードへのポインタの配列。リストを分割するよりも高速ですが、リストを配列に移動し、配列をソートし、ソートされた配列から新しいリストを作成する方が速いです。 – rcgldr