链表的快排
前一段时间有位朋友要求用链表找出中位数,闲来无事写了个链表的快排.但我想我这应该不算是真正意义上的快排,因为多了一个检查指针位置的函数,时间复杂度上应该是超了.另外,如果用这个思路写中位数,应该再多一个从链表头查找第 K 位数的函数,时间复杂度上也应该是超了.
总之,程序贴出来,请大家多多指教,请高手们不吝指教,本菜多多学习才是,谢谢大家了.
程序代码:
#include <stdio.h>
#include<stdlib.h>
typedef struct tmp
{
int num;
}tmp;
typedef struct st
{
tmp *q;
struct st *ago;
struct st *after;
}st;
st *make_line(); // 建立链表
st *len_line(st *head); // 查找链表的尾部
void line_sort(st *head,st *p,st *r); // 排序
void wap(st *head,st *a,st *b); // 交换链表的数据
void print(st *head); // 输出
void del_line(st *head); // 销毁链表
int check(st *p,st *r); // 检查指针的位置
int main(void)
{
st *head,*len;
head=make_line();
len=len_line(head);
line_sort(head,head->after,len);
print(head->after);
del_line(head);
return 0;
}
st *make_line()
{
st *head,*p,*t;
tmp *l;
int n,i=0;
p=t=NULL;
while((head=(st *)malloc(sizeof(st)))==NULL);
head->ago=head->after=NULL;
while((scanf("%d",&n))==1)
{
while((p=(st *)malloc(sizeof(st)))==NULL);
while((l=(tmp *)malloc(sizeof(tmp)))==NULL);
l->num=n;
p->q=l;
if(!i)
{
head->after=p;
p->ago=head;
t=p;
i=1;
}
else
{
t->after=p;
p->ago=t;
t=p;
}
}
p->after=NULL;
return head;
}
st *len_line(st *head)
{
st *p=head;
while(p->after)
{
p=p->after;
}
return p;
}
void line_sort(st *head,st *p,st *r)
{
st *i,*j,*d;
int x;
if(check(p,r))
{
i=p->ago;
x=r->q->num;
d=p;
for(j=p;j!=r;j=j->after)
{
if(j->q->num<=x)
{
i=i->after;
if(i!=j)
{
wap(head,i,j);
}
}
}
i=i->after;
if(i!=r)
{
wap(head,i,r);
}
line_sort(head,p,i->ago);
line_sort(head,i->after,r);
}
}
void wap(st *head,st *a,st *b)
{
tmp *t;
t=a->q;
a->q=b->q;
b->q=t;
}
void print(st *head)
{
while(head)
{
printf("%d ",head->q->num);
head=head->after;
}
puts("");
}
int check(st *p,st *r)
{
while(p)
{
if(p->after==r)
{
return 1;
}
p=p->after;
}
return 0;
}
void del_line(st *head)
{
st *t=NULL;
while(head)
{
t=head;
head=head->after;
free(t);
}
free(t);
}











不推荐用递归!