数据结构 ——冒泡排序

冒泡排序 (Bubble Sort)是一种最简单的交换排序方法,它通过两两比较相邻记录的关键字,如果发生逆序,则进行交换,从而使关键字小的记录如气泡一般逐渐往上“漂移”(左移),或者使关键字大的记录如石块一样逐渐向下“坠落”(右移)。 

[算法步骤]
①设待排序的记录存放在数组r[1~n]中。首先将第一个记录的关键字和第二个记录的关键字进行比较,若为逆序(即L.[1].key>L.r[2].key),则交换两个记录。然后比较第二个记录和第三个记录的关键字。依次类推,直至第n-1个记录和第n个记录的关键字进行过比较为止。上述过程称作第一趟起泡排序,其结果使得关键字最大的记录被安置到最后一个记录的位置。


②然后进行第二趟起泡排序,对前n-1个记录进行同样操作,其结果是使关键字次大的记录被安置到第n-1个记录的位置上。

③重复上述比较和交换过程,第i趟是从L.r[1]到L.r[n-i+1]依次比较相邻两个记录的关键字,
并在“逆序”时交换相邻记录,其结果是这n -i+1个记录中关键字最大的记录被交换到第n-i+1
的位置上。直到在某一趟排序过程中没有进行过交换记录的操作,说明序列已全部达到排序要求,则完成排序。

代码如下:


#define ElemType int
void BubbleSort(SqList &L)
{
	//对顺序表L做冒泡排序
	int m,j,flag;
	ElemType t;
    m=L.length-1; flag=1; 				//flag用来标记某一趟排序是否发生交换
    while((m>0)&&(flag==1))
	{
		flag=0;           				//flag置为0,如果本趟排序没有发生交换,则不会执行下一趟排序
        for(j=1;j<=m;j++)
			if(L.r[j].key>L.r[j+1].key)
			{
				flag=1;					//flag置为1,表示本趟排序发生了交换
				t=L.r[j];L.r[j]=L.r[j+1];L.r[j+1]=t;	//交换前后两个记录
			}//if
		--m;
    }//while
}

 定义

#include <iostream>
using namespace std;
typedef struct
{
    int key;                                 //关键字域
	char *otherinfo;                          //其他域
}ElemType;

//顺序表的存储结构
typedef struct
{
    ElemType *r;	         						//存储空间的基地址
    int  length;            						//顺序表长度
}SqList;	

创建顺序表

void Create_Sq(SqList &L)
{
	int i=1,n;
	cin>>n;
	while(n)
	{
		L.r[i++].key=n;
		cin>>n;
		L.length++;
	}
}

输出形式

void show(SqList L)
{
	int i;
	for(i=1;i<=L.length;i++)
		cout<<L.r[i].key<<" ";
}

全部代码

#include <iostream>
using namespace std;
typedef struct
{
    int key;
	char *otherinfo;
}ElemType;
//顺序表的存储结构
typedef struct
{
    ElemType *r;	         						//存储空间的基地址
    int  length;            						//顺序表长度
}SqList;	

void show(SqList L)
{
	int i;
	for(i=1;i<=L.length;i++)
		cout<<L.r[i].key<<" ";
}
										//顺序表类型
void BubbleSort(SqList &L)
{
	//对顺序表L做冒泡排序
	int m,j,flag;
	ElemType t;
    m=L.length-1; flag=1; 				//flag用来标记某一趟排序是否发生交换
    while((m>0)&&(flag==1))
	{
		flag=0;           				//flag置为0,如果本趟排序没有发生交换,则不会执行下一趟排序
        for(j=1;j<=m;j++)
			if(L.r[j].key>L.r[j+1].key)
			{
				flag=1;					//flag置为1,表示本趟排序发生了交换
				t=L.r[j];L.r[j]=L.r[j+1];L.r[j+1]=t;	//交换前后两个记录
			}							//if
		--m;
    }									//while
}										//BubbleSort
void Create_Sq(SqList &L)
{
	int i=1,n;
	cin>>n;
	while(n)
	{
		L.r[i++].key=n;
		cin>>n;
		L.length++;
	}
}

 
int main()
{
	SqList L;
	L.r=new ElemType[100];
	L.length=0;
    printf("输入待排序元素(以0结束):");
	Create_Sq(L);
	BubbleSort(L);
	show(L);
}

如果要输出每一趟结果:

只需要定义一个n控制输出躺数:

#include <iostream>
using namespace std;
int n=0;
typedef struct
{
    int key;
	char *otherinfo;
}ElemType;
//顺序表的存储结构
typedef struct
{
    ElemType *r;	         						//存储空间的基地址
    int  length;            						//顺序表长度
}SqList; 

void show(SqList L)
{
	int i;
	n++;
	for(i=1;i<=L.length;i++)
		cout<<L.r[i].key<<" ";
	printf("\n");
}	

										//顺序表类型
void BubbleSort(SqList &L)
{
	//对顺序表L做冒泡排序
	int m,j,flag;
	ElemType t;
    m=L.length-1; flag=1; 				//flag用来标记某一趟排序是否发生交换
    while((m>0)&&(flag==1))
	{
		flag=0;           				//flag置为0,如果本趟排序没有发生交换,则不会执行下一趟排序
        for(j=1;j<=m;j++)
			if(L.r[j].key>L.r[j+1].key)
			{
				flag=1;					//flag置为1,表示本趟排序发生了交换
				t=L.r[j];L.r[j]=L.r[j+1];L.r[j+1]=t;	//交换前后两个记录
			}							//if
		--m;
			printf("第%d次排序:",n+1);	//while
			show(L);
}	
									//BubbleSort
void Create_Sq(SqList &L)
{
	int i=1,n;
	cin>>n;
	while(n)
	{
		L.r[i++].key=n;
		cin>>n;
		L.length++;
	}
}

 
int main()
{
	SqList L;
	L.r=new ElemType[100];
	L.length=0;
    printf("输入待排序元素(以0结束):");
	Create_Sq(L);
	BubbleSort(L);
	show(L);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值