链表的冒泡法排序 链表的冒泡排序

void bubbleSort(Linklist&pHead)
{
Node* pEnd =NULL;//终止指针
Node*pTemp;//临时存放终止指针
Node* p1 =new Node();
p1->pNext= pHead;
pHead =p1;
Node*p2;

while(pEnd!= pHead)
{
pTemp =pHead;
for(p1 =pHead; p1->pNext->pNext != pEnd; p1 = p1->pNext)
{
if(p1->pNext->data >p1->pNext->pNext->data)
链表的冒泡法排序 链表的冒泡排序
{
p2 =p1->pNext->pNext;
p1->pNext->pNext = p2->pNext;
p2->pNext= p1->pNext;
p1->pNext= p2;
pTemp =p1->pNext->pNext;
}
}
pEnd =pTemp;
}

p1 =pHead;
pHead =pHead->pNext;
deletep1;
p1 =NULL;
}

相关资料:

对链表进行冒泡排序的基本思想就是对当前还未排好序的范围内的全部节点,自上而下对相邻的两个节点依次进行比较和调整,让键值(就是用它排序的字段,我们取学号num为键值)较大的节点往下沉,键值较小的往上冒。即:每当两相邻的节点比较后发现它们的排序与排序要求相反时,就将它们互换。

单向链表的冒泡排序图示:
---->[1]---->[3]---->[2]...---->[n]---->[NULL](原链表)
head1->next 3->next2->nextn->next

---->[1]---->[2]---->[3]...---->[n]---->[NULL](排序后链表)
head1->next 2->next3->nextn->next

图14:有N个节点的链表冒泡排序

任意两个相邻节点p、q位置互换图示:
假设p1->next指向p,那么显然p1->next->next就指向q,
p1->next->next->next就指向q的后继节点,我们用p2保存
p1->next->next指针。即:p2=p1->next->next,则有:
[]---->[p]---------->[q]---->[](排序前)
p1->nextp1->next->next p2->next
图15

[]---->[q]---------->[p]---->[](排序后)

图16

1、排序后q节点指向p节点,在调整指向之前,我们要保存原p的指向节点地址,即:p2=p1->next->next;
2、顺着这一步一步往下推,排序后图16中p1->next->next要指的是p2->next,所以p1->next->next=p2->next;
3、在图15中p2->next原是q发出来的指向,排序后图16中q的指向要变为指向p的,而原来p1->next是指向p的,所以p2->next=p1->next;
4、在图15中p1->next原是指向p的,排序后图16中p1->next要指向q,原来p1->next->next(即p2)是指向q的,所以p1->next=p2;
5、至此,我们完成了相邻两节点的顺序交换。
6、下面的程序描述改进了一点就是记录了每次最后一次节点下沉的位置,这样我们不必每次都从头到尾的扫描,只需要扫描到记录点为止。因为后面的都已经是排好序的了。

对链表进行冒泡排序的函数为:


struct student *BubbleSort (struct student *head)
{
structstudent*endpt; //控制循环比较
structstudent *p; //临时指针变量
structstudent *p1,*p2;

p1 = (structstudent *) malloc (LEN);
p1->next= head;//注意理解:我们增加一个节点,放在第一个节点的前面,主要是为了便于比较。因为第一个节点没有前驱,我们不能交换地址
head =p1;//让head指向p1节点,排序完成后,我们再把p1节点释放掉

for (endpt =NULL; endpt != head; endpt =p)//结合第6点理解
{
for (p = p1= head; p1->next->next != endpt; p1 = p1->next)
{
if(p1->next->num >p1->next->next->num)//如果前面的节点键值比后面节点的键值大,则交换
{
p2 =p1->next->next; //结合第1点理解
p1->next->next =p2->next; //结合第2点理解
p2->next=p1->next;//结合第3点理解
p1->next= p2; //结合第4点理解
p =p1->next->next;//结合第6点理解
}
}
}

p1 =head;//把p1的信息去掉
head =head->next;//让head指向排序后的第一个节点
free(p1);//释放p1
p1 =NULL;//p1置为NULL,保证不产生“野指针”,即地址不确定的指针变量

returnhead;
}

  

爱华网本文地址 » http://www.413yy.cn/a/25101013/176429.html

更多阅读

常用的发明创造技法之稽核问题表法1 创造技法

下面,就一些常用的发明创造技法向大家作简要介绍。稽核问题表法该法是根据需要解决的问题或研究对象列出有关问题,然后逐个检核,以探求解决问题的新观念,实现创造性解决问题的目的。比较有名的稽核问题表法是奥斯本的稽核问题表法、美

如何对工作簿中的工作表排序? 工作表和工作簿的区别

问:您好,脚本专家!如何对工作簿中的工作表排序?-- FS答:您好,FS。如何才能对工作簿中的工作表排序呢?嗯,说实话,对工作簿中的工作表排序并不像我们原想的那样容易。这并不意味着无法做到,只是指该过程稍微有点复杂。正因如此,如果您没有完全理

声明:《链表的冒泡法排序 链表的冒泡排序》为网友花开半夏分享!如侵犯到您的合法权益请联系我们删除