实现冒泡排序算法
冒泡排序(Bubble Sort)是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。
这个算法的名字由来是因为越大的元素会经由交换慢慢“浮”到数列的顶端,故名。
冒泡排序算法的原理:(从后往前)
1、比较相邻的元素。如果第一个比第二个大,就交换他们两个。
2、对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
3、针对所有的元素重复以上的步骤,除了最后一个。
4、持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
/**
* 实验题目:
* 实现冒泡排序算法
* 实验目的:
* 领会冒泡排序的过程和算法设计
* 实验内容:
* 设计程序,实现冒泡排序算法。用相关数据进行测试,并
* 输出各趟的排序结果。
*/
#include <stdio.h>
#define MAX_LEN (100) // 最大长度
typedef int key_type; // 定义关键字类型为int
typedef char info_type;
typedef struct
{
key_type key; // 关键字项
info_type data; // 其他数据项,类型为info_type
}rec_type; // 查找元素的类型
/*-----------------x和y交换------------------*/
void swap_rec(rec_type &x, rec_type &y) // 引用类型
{
rec_type tmp = x;
x = y;
y = tmp;
}
/*-----------------创建顺序表------------------*/
void create_list(rec_type recs[], key_type keys[], int n)
{
int i;
for(i = 0; i < n; i++) // recs[0...n-1]存放排序记录
recs[i].key = keys[i];
}
/*-----------------输出顺序表------------------*/
void disp_list(rec_type recs[], int n)
{
int i;
for(i = 0; i < n; i++)
printf("%d ", recs[i].key);
printf("\n");
}
/*-----------------以下运算针对堆排序的程序------------------*/
/*-----------------创建顺序表------------------*/
void create_list1(rec_type recs[], key_type keys[], int n)
{
int i;
for(i = 1; i <= n; i++) // recs[1...n]存放排序记录
{
recs[i].key = keys[i - 1];
}
}
/*-----------------输出顺序表------------------*/
void disp_list1(rec_type recs[], int n)
{
int i;
for(i = 1; i <= n; i++)
{
printf("%d ", recs[i].key);
}
printf("\n");
}
#include <stdbool.h>
/*-----------------对recs[0...n-1]按递增有序进行冒泡排序---------------------*/
static void bubble_sort(rec_type recs[], int n)
{
int i;
int j;
bool exchange;
for(i = 0; i < n - 1; i++) // 循环趟数
{
exchange = false; // 一趟前exchange置为假
for(j = n - 1; j > i; j--) // 归位recs[i],循环n-i-1次
{
if(recs[j].key < recs[j - 1].key) // 相邻两个元素反序时
{
swap_rec(recs[j], recs[j - 1]); // 将这两个元素交换
exchange = true; // 一旦有交换,exchange置为真
}
}
printf(" i = %d: 归位元素%d, 排序结果: ", i, recs[i].key);
disp_list(recs, n);
if(!exchange) // 本趟没有发生交换,中途结束算法
return;
}
}
int main(int argc, char *argv[])
{
int n = 10;
key_type a[] = {6, 8, 7, 9, 0, 1, 3, 2, 4, 5};
rec_type recs[MAX_LEN];
create_list(recs, a, n);
printf("排序前: ");
disp_list(recs, n);
bubble_sort(recs, n);
printf("排序后: ");
disp_list(recs, n);
return 0;
}
测试结果:
排序前: 6 8 7 9 0 1 3 2 4 5
i = 0: 归位元素0, 排序结果: 0 6 8 7 9 1 2 3 4 5
i = 1: 归位元素1, 排序结果: 0 1 6 8 7 9 2 3 4 5
i = 2: 归位元素2, 排序结果: 0 1 2 6 8 7 9 3 4 5
i = 3: 归位元素3, 排序结果: 0 1 2 3 6 8 7 9 4 5
i = 4: 归位元素4, 排序结果: 0 1 2 3 4 6 8 7 9 5
i = 5: 归位元素5, 排序结果: 0 1 2 3 4 5 6 8 7 9
i = 6: 归位元素6, 排序结果: 0 1 2 3 4 5 6 7 8 9
i = 7: 归位元素7, 排序结果: 0 1 2 3 4 5 6 7 8 9
排序后: 0 1 2 3 4 5 6 7 8 9