基础知识
参考:
十大排序算法总结 https://www.zhihu.com/tardis/sogou/art/42586566
1 结点位置
1.1 求链表中间结点
LinkList* Find_InterNode(LinkList* HeaderList)
{
PT_Link ptHeaderList = (PT_Link)HeaderList;
assert(NULL != ptHeaderList);
PT_Link FastNode = ptHeaderList;
PT_Link SlowNode = ptHeaderList;
while((NULL != FastNode) && (NULL != FastNode->next))
{
FastNode = FastNode->next->next;
SlowNode = SlowNode->next;
}
return SlowNode;
}
1.2 求倒数第N个结点
LinkList* Find_NthNode(LinkList* HeaderList, int n)
{
PT_Link ptHeaderList = (PT_Link)HeaderList;
assert((NULL != ptHeaderList) && (n > 0));
PT_Link FastNode = ptHeaderList;
PT_Link SlowNode = ptHeaderList;
int i = 0;
for(i=0; i<n-1; i++) // 先让FastNode走N-1步
{
if(NULL != FastNode->next)
{
FastNode = FastNode->next;
}
else
{
return NULL;
}
}
while(FastNode->next) // 剩下的一起走
{
FastNode = FastNode->next;
SlowNode = SlowNode->next;
}
return SlowNode;
}
2 链表排序
2.1 冒泡排序
void LinkList_BubbleSort(LinkList* HeaderList)
{
PT_Link ptHeaderList = (PT_Link)HeaderList;
PT_Link p;
PT_Link q;
for(p=ptHeaderList->next; p!=NULL; p=p->next)
{
for(q=p->next; q!=NULL; q=p->next)
{
if(p->data > q->data)
{
int tempdata = p->data;
p->data = q->data;
q->data = tempdata;
}
}
}
}
2.2 快速排序
LinkList* FindEndList(LinkList* HeaderList)
{
PT_Link ptHeaderList = (PT_Link)HeaderList;
PT_Link ptLink = ptHeaderList;
while(ptLink->next)
{
ptLink = ptLink->next;
}
return ptLink;
}
LinkList* FindPiovt(LinkList* ListBegin, LinkList* ListEnd)
{
/* 前后指针法 */
PT_Link pivot = (PT_Link)ListBegin;
PT_Link FrontNode = (PT_Link)ListBegin; // 表头
PT_Link ptEndList = (PT_Link)ListEnd; //表尾
assert(NULL != FrontNode && NULL != ptEndList);
PT_Link NextNode = FrontNode->next;
while((FrontNode != ptEndList) && (NextNode->next != NULL))
{
if(NextNode->data < pivot->data)
{
FrontNode = FrontNode->next;
int swap_data = FrontNode->data;
FrontNode->data = NextNode->data;
NextNode->data = swap_data;
}
NextNode = NextNode->next;
}
int data = pivot->data;
pivot->data = FrontNode->data;
FrontNode->data = data;
return FrontNode;
}
void LinkList_QuickSort(LinkList* ListBegin,LinkList* ListEnd)
{
PT_Link ptListBegin = (PT_Link)ListBegin; // 表头
assert(NULL != ptListBegin);
PT_Link ptEndList = (PT_Link)ListEnd; //表尾
if(ptListBegin != ptEndList)
{
if(-1 == ptListBegin->data)
{
ptListBegin = ptListBegin->next;
}
PT_Link pivot = (PT_Link)FindPiovt((LinkList*)ptListBegin, (LinkList*)ptEndList);
LinkList_QuickSort((LinkList*)ptListBegin, (LinkList*)pivot);
LinkList_QuickSort((LinkList*)pivot->next, (LinkList*)ptEndList);
}
}