单链表排序(升序):
简易法:
/*
我们对链表进行循环遍历,每次找到最大值放在为排序的最前面。
*/
// 低效率递增排序
void sort(List L){
int s;
LNode*p,*q;
p = L->next;
while (p != NULL)
{
q = p->next;
s = p->data;
while (q != NULL)
{
if(q->data < s){
s = q->data;
q->data = p->data;
p->data = s;
}
q = q->next;
}
p = p->next;
}
}
采用插入排序的思想进行排序:
/*
将链表分成两个部分,左边为已排序,右边为未排序,每次在右边取其中一个元素,到左边进行排序插入。
*/
// 插入排序
void insertSort(List L){
//1.我们需要将链表分为两段,左边是已经排序好的,而右边是乱序的。
LNode *p,*q,*r,*pre;
p = L->next;
q = p->next;
p->next = NULL;
//2.每次取右边的一个元素到左边有序链表中进行插入
while(q != NULL){
pre= L; //pre代表插入位置的前面一个元素
r = q->next; // r用来记录未排序子链的头
while (p!=NULL && p->data<q->data)
{ // 循环找到需要插入的位置
p = p->next;
pre = pre->next;
}
// 进行插入
q->next = p;
pre->next = q;
q = r;
//将p指针还原到首元节点处,等待下一次的排序
p = L->next;
}