冒泡排序——数组&链表
Posted zhulmz
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了冒泡排序——数组&链表相关的知识,希望对你有一定的参考价值。
排序过程
对一组数据排序,例如 【5 、2、3、1、4】
- 第一轮排序后 【2、3、1、4、5】
- 第二轮排序后 【2、1、3、4、5】
- 第三轮排序后 【1、2、3、4、5】
数组的冒泡排序
int flag=0,temp;
int s[10]={9,8,7,6,5,4,3,2,1,0}; //定义数组并赋值
for(int i=0;i<10;i++)
{
for(int j=0;j<10-i-1;j++)
{
if(s[j]>s[j+1]){
temp=s[j];
s[j]=s[j+1];
s[j+1]=temp;
flag=1;
}
}
if(flag==0)
break;
}
上述代码,外层循环控制循环的次数,最坏的情况下循环10次排序完成;内层循环控制比较个数;flag用来判断是否发生交换,如果没发生交换,则说明已经排序完成,则不需要接着循环到10次;
链表的冒泡排序
下面代码针对的是不带头节点(即第一个结点的数据域不为空)的链表
void swap(){
STUDENT *head_front ;
head_front=(STUDENT *)malloc(sizeof(STUDENT)); //为链表设置一个数据域为空的头节点
head_front->next=head;
STUDENT *t, *p,*q,*temp;
for(int i=0;i<sum+1;i++) //上面加了一个结点,所以这而是sum+1
{
int flag = 1;
t=head_front;
p=t->next;
q=p->next;
for(int j=0;j<sum-i-1;j++)
{
if(p->num > q->num)
{
t->next = q;
p->next = q->next;
q->next = p;
temp = p; p = q;q = temp;
flag = 0;
}
t = t->next;
p = t->next;
q = p->next;
}
if(flag)
break;
}
free(head_front); //排序完成后释放掉内存
}
上面的代码只能实现链表第一个元素比第二个元素小的排序,研究了好长时间,我也不知道为什么,等我弄明白之后在回来修改;
完整代码
#include<stdio.h>
#include<stdlib.h>
typedef struct student
{
int num;
char name;
struct student *next;
}STUDENT;
STUDENT *head;
int sum;
void create(){
int num1;
char name1;
STUDENT *p_end=NULL,*p_new;
int i=0;
printf("请输入元素个数:");
scanf("%d",&sum);
for(int t=0;t<sum;t++)
{
printf("第%d个学生信息:",++i);
scanf("%d %c",&num1,&name1);
if(getchar()=='%')
break;
p_new=(STUDENT *)malloc(sizeof(STUDENT));
if(p_new==NULL)
exit(0);
if(i==1)
{
p_new->name=name1;
p_new->num=num1;
head=p_new;
p_end=p_new;
}
else
{
p_new->name=name1;
p_new->num=num1;
p_end->next=p_new;
p_new->next=NULL;
p_end=p_new;
}
}
}
void swap(){
STUDENT *head_front ;
head_front=(STUDENT *)malloc(sizeof(STUDENT));
head_front->next=head;
STUDENT *t, *p,*q,*temp;
for(int i=0;i<sum+1;i++)
{
int flag = 1;
t=head_front;
p=t->next;
q=p->next;
for(int j=0;j<sum-i-1;j++)
{
if(p->num > q->num)
{
t->next = q;
p->next = q->next;
q->next = p;
temp = p; p = q;q = temp;
flag = 0;
}
t = t->next;
p = t->next;
q = p->next;
}
if(flag)
break;
}
free(head_front);
}
void output()
{
STUDENT *p;
p=head;
for(int i=0;i<sum;i++)
{
printf("%d %c
",p->num, p->name);
p=p->next;
}
printf("
");
}
int main()
{
head=NULL;
create();
swap();
output();
}
以上是关于冒泡排序——数组&链表的主要内容,如果未能解决你的问题,请参考以下文章