冒泡排序(Bubble Sort)是一种交换排序,它的基本思路是:两两比较相邻记录的关键字,如果反序则交换,直到没有反序的记录为止。
#include<iostream>
using namespace std;
#define MaxSize 10
#define TRUE 1
#define FALSE 0
typedef struct
{
int r[MaxSize];
int length;
}SqList;
void swap(SqList* L, int i, int j)
{
int temp = L->r[i];
L->r[i] = L->r[j];
L->r[j] = temp;
}
//冒泡排序初级版,对顺序表L作交换排序
void BubbleSort0(SqList* L)
{
int i, j;
for (i = 1; i < L->length; i++)
{
for (j = i + 1; j <= L->length; j++)
{
if (L->r[i] > L->r[j])
swap(L, i, j);
}
}
}
//正宗的冒泡排序,较小数字如同气泡般慢慢浮到上面
void BubbleSort1(SqList* L)
{
int i, j;
for (i = 1; i < L->length; i++)
{
for (j = L->length - 1; j >= i; j--)
{
if (L->r[j] > L->r[j + 1])
swap(L, j, j + 1);
}
}
}
//冒泡排序优化,如果没有任何数据交换说明序列已经有序,不需要再继续后面的循环判断工作了,因此增加一个标记变量flag来实现这一算法的改进
void BubbleSort2(SqList* L)
{
int i, j;
int flag = TRUE;
for (i = 1; i < L->length && flag; i++)
{
flag = FALSE;
for (j = L->length - 1; j >= i; j--)
{
if (L->r[j] > L->r[j + 1])
{
swap(L, j, j + 1);
flag = TRUE;
}
}
}
}
int main()
{
SqList L;
int r[MaxSize] = { 9,8,7,6,5,4,3,2,1 };
L.length = 9;
for (int i = 0; i < L.length; i++)
L.r[i + 1] = r[i];
BubbleSort2(&L);
for (int i = 1; i <= L.length; i++)
{
cout << L.r[i] << endl;
}
return 0;
}