1。外循环:进行N-1轮(每轮均从表头开始)遍历
2。内循环:每轮遍历的“相邻结点对”从N-1递降到1对
3。内循环体:如果被访问的“结点对”不符合排序要求则
采取下列两种措施之一(不能“双管齐下”)
⑴数据交换(适宜数据量小的情况下使用)
⑵改变这一对结点在链中的先后顺序(大数据量情况下)
显然措施⑵才体现链表的特色。
落霞与孤鹜齐飞,秋水共长天一色! 心有多大,路有多宽。三教九流,鸡鸣狗盗。兼收并蓄,海纳百川。
1。既然都用链表了,通常在Create阶段就已经自然而然地实施了插入排序。好比打80分,你每摸到1张扑克,是不是随手就将它安插到正确位置上去了呢?
2。就算猛地一下拿到许多牌,理一下也不太麻烦。下面写一个
/*无序链表的冒泡法排序*/
/*
编程任务:用链表实现若干个考分的降序排列
补充规定:最初链表上的准考证号是升序排列
而沿链表各结点的考分则完全无序
考生信息:㈠准考证号;㈡考分
*/
#include<stdio.h>
#include<stdlib.h>
int total=0; /*总人数*/
struct person
{ /*结点的数据结构*/
long ID; /*准考证号*/
float fen; /*考分*/
struct person* next; /*指向下一个结点*/
};
int main(void)
{ struct person Head={0L,0.0,NULL};
struct person*head=&Head,*p,*q;
void bubble(struct person*);
q=head;
while(1)
{
long ID; float score;
printf("No.%d: ID,score=",total+1); /*提示信息*/
scanf("%ld%*c%f",&ID,&score); /*ID与score之间可用任意字符隔开*/
if(ID<=0L)break; /*约定用不合理的准考证号代表输入到此为止*/
p=(struct person*)malloc(sizeof(struct person));/*假设申请新结点次次成功*/
q->next=p; /*令新结点入链*/
p->next=NULL; /*权作链尾*/
p->ID=ID;
p->fen=score;
total++;
q=p;/*"新"变"旧",让p迎接更新的*/
} /*至此考生信息全部登录到了链表*/
bubble(head);/*用冒泡法对考分排序*/
/*下面是对链表的遍历,以验证登录*/
p=head->next;/*Head结点是空架子*/
while(p!=NULL)
{
printf("%ld: %4.1f\n",p->ID,p->fen);
p=p->next;
}
return 0;
}
/*用冒泡法对total个考分排序*/
void bubble(struct person* src)
{ int i,j;
struct person *p,*q,*r;
for(i=1;i<=total-1;i++) /*第i轮*/
{ r=src;
q=r->next;
p=q->next;
for(j=1;j<=total-i;j++)/*第j次*/
if(q->fen < p->fen)
{ r->next=p;
q->next=p->next;
p->next=q;
r=p;
p=q->next;
}
else
{ r=q;
q=p;
p=p->next;
}
}
}