链表排序

double cmp(ListNode *p ,ListNode *q)

{return (p->keyVal - q->keyVal);}

ListNode* mergeSortList(ListNode *head)

{

ListNode *p, *q, *tail, *e;

int nstep = 1;

int nmerges = 0;

int i;

int psize, qsize;

if (head == NULL || head->next == NULL)

{return head;}

while (1)

{

p = head;

tail = NULL;

nmerges = 0;

while (p)

{ nmerges++; q = p; psize = 0;

for (i = 0; i < nstep; i++){

psize++;

q = q->next;

if (q == NULL)break;

}

qsize = nstep;

while (psize >0 || (qsize >0 && q))

{

if (psize == 0 ){e = q; q = q->next; qsize--;}

elseif (q == NULL || qsize == 0){e = p; p = p->next; psize--;}

elseif (cmp(p,q) <= 0){e = p; p = p->next; psize--;}

else{e = q; q = q->next; qsize--;}

if (tail != NULL){tail->next = e;}

else{head = e;}

tail = e;

}

p = q;

}

tail->next = NULL;

if (nmerges <= 1){return head;}

else{nstep <<= 1;}

}

}

思路分析:

链表排序最好使用归并排序算法。堆排序、快速排序这些在数组排序时性能非常好的算法,在链表只能“顺序访问”的魔咒下无法施展能力,但是归并排序却如鱼得水,非但保持了它O(nlogn)的时间复杂度,而且它在数组排序中广受诟病的空间复杂度在链表排序中也从O(n)降到了O(1),真是好得不得了啊,哈哈。以上程序是递推法的程序,另外值得一说的是看看那个时间复杂度,是不是有点眼熟?对,这就是分治法的时间复杂度,归并排序又是divide and conquer。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值