自下而上合并排序处理每个大小为1的元素的列表,并反复合并子列表,直到它们按排序顺序排列。这使得使用自下而上合并排序对链表进行排序非常有吸引力,因为它们已经“分离”了。
我正在尝试用C语言实现自下而上的合并排序,并意识到有各种方法来实现自下而上的合并排序;特别是,我正在使用这种方法:
但是,我正在努力实现以下目标:
因此,我的问题是:
我认为这是在链表上使用自下而上合并排序的优势之一,因为它比在数组上使用自下而上合并排序更节省空间。如果我错了,请纠正我。
答案 0 :(得分:2)
答案 1 :(得分:1)
有一个聪明的方法,它使用固定大小的数组(26或32是常见大小)指向节点的指针数组,一些工作本地指针指向节点,以及标准mergelists()函数合并两个已经排序的列表,并且需要处理空列表以使主代码更简单。节点合并到数组中,然后将数组合并到单个排序列表中。这个逻辑的第一部分是:
// initialize array[] to all NULLs
while(plist != NULL){
pmerge = plist;
plist = plist->next;
pmerge->next = NULL;
for(i = 0; i < array size; i++){
if(array[i] == NULL)
break;
pmerge = mergelists(array[i], pmerge);
array[i] = NULL;
}
if(i == array size)i--;
array[i] = pmerge;
}
当i增加时,列表的大小加倍,array [i]为NULL或指向列表,其中2为power i节点。
然后将数组合并到一个列表中,同样只需要一个循环并调用mergelists()。看看你是否可以弄清楚这一部分。