【发布时间】:2012-03-26 08:06:30
【问题描述】:
我有使用链表进行合并排序的代码,它工作正常,我的问题是这个算法的复杂性是多少?它是 O(nlog(n)) 吗?它也稳定吗?我很感兴趣,因为我知道合并排序是稳定的,使用链表怎么样?如果我们有一些彼此相等的元素,这段代码是否保留元素的顺序?非常感谢
#include<stdio.h>
#include <stdlib.h>
struct node
{
int number;
struct node *next;
};
struct node *addnode(int number,struct node *next);
struct node*mergesort(struct node *head);
struct node *merge(struct node *one,struct node *two);
int main(void){
struct node *head;
struct node *current;
struct node *next;
int test[]={8,3,1,4,2,5,7,0,11,14,6};
int n=sizeof(test)/sizeof(test[0]);
int i;
head=NULL;
for (i=0;i<n;i++)
head=addnode(test[i],head);
i=0;
head=mergesort(head);
printf("before----after sort \n");
for (current=head;current!=NULL;current=current->next)
printf("%4d\t%4d\n",test[i++],current->number);
/* free list */
for (current=head;current!=NULL;current=current->next)
next=current->next;free(current);
return 0;
}
struct node *addnode(int number,struct node* next){
struct node *tnode;
tnode=(struct node*)malloc(sizeof(*tnode));
if(tnode!=NULL){
tnode->number=number;
tnode->next=next;
}
return tnode;
}
struct node *mergesort(struct node *head){
struct node *head_one;
struct node *head_two;
if((head==NULL) ||(head->next==NULL))
return head;
head_one=head;
head_two=head->next;
while( (head_two!=NULL) &&(head_two->next!=NULL)){
head=head->next;
head_two=head->next->next;
}
head_two=head->next;
head->next=NULL;
return merge(mergesort(head_one),mergesort(head_two));
}
struct node *merge(struct node*head_one,struct node*head_two){
struct node *head_three;
if(head_one==NULL)
return head_two;
if(head_two==NULL)
return head_one;
if(head_one->number<head_two->number){
head_three=head_one;
head_three->next=merge(head_one->next,head_two);
}
else
{
head_three=head_two;
head_three->next=merge(head_one,head_two->next);
}
return head_three;
}
【问题讨论】:
-
到目前为止你做了哪些分析?您可以通过在不同的输入上运行算法并绘制运行时间以及检查它是否稳定来回答您自己的问题。
-
诸如“合并排序的复杂性是什么?”之类的问题。并且“合并排序是否稳定”通过网络搜索很容易回答。
-
@DavidHeffernan:OP 似乎总体上意识到 Mergesort 的复杂性和稳定性,但想知道这个具体的实现。
-
@templatetypedef :这只会给出平均时间复杂度。
标签: c linked-list mergesort