Ⅰ )算法思想
冒泡排序是一种相对简单并且容易理解、容易实现的一种排序算法。其基本思想是:依次比较相邻的两个数,若想相邻的两个数逆序,则交换位置。即在第一趟:首先比较第1个和第2个数,将小数放前,大数放后(升序排列)。然后比较第2个数和第3个数,将小数放前,大数放后,如此继续,直至比较最后两个数,将小数放前,大数放后。至此第一趟结束,将最大的数放到了最后。
然后进行第二次趟冒泡排序,对前n-1个记录进行同样的操作,其结果是使次大的记录放在第n-1个记录的位置上。
然后进行第三次趟冒泡排序,对前n-2个记录进行同样的操作,其结果是使第三大的记录放在第n-2 个记录的位置上。
如此反复,每一趟冒泡排序都将一个记录排到位,直到剩下一个最小的记录。
若在某一趟的冒泡排序过程中,没有发现一个逆序,则可直接结束整个排序过程,所以冒泡排序最多进行n-1 趟比较。
Ⅱ)源代码
//冒泡排序 #include<stdio.h> #define MaxSize 50 typedef struct { int key; }RecordType; //记录方式 typedef struct { int length; RecordType r[MaxSize+1]; //记录表 }RecordList; void BubbleSort(RecordList *l,int length) //冒泡排序 { int x; //定义中间变量 for (int i = 0; i <=l->length - 1; i++) { for (int j = 0; j <=l->length - 1 - i; j++) //由于定义了一个RecordList *l,所以使用->表所属 { if (l->r[j].key >l->r[j + 1].key) { x = l->r[j].key; //交换顺序 l->r[j].key = l->r[j + 1].key; l->r[j + 1].key = x; } } } } int main(void) { RecordList l = { 10, 0, 4,5, 1, 9, 6, 8, 0, 3, 7, 2 }; BubbleSort(&l, 10); for (int i = 1; i <= 10; i++) //循环输出结果 { printf("%d\t", l.r[i].key); } printf("\n"); return 0; }