冒泡排序的基本概念:
依次比较相邻的两个数,将小的放在前面,大数放在后面。
即在第一趟:首先比较第1个和第二个数,将小数放前,大数放后,然后比较第2个和第3个数,将小数放前,大数放后,
如此继续,直到比较最后两个数,将小数放前,大数放后。 至此第一趟结束,将最大的放到了最后。
在第二趟:仍从第一对数开始比较(因为可能由于第2个数和第3个数的交换,使得第1个数不在小于第2个数),将小数放前,大数放后,一直比较到倒数第二个数(倒数第一的位置上已经是最大的),第二趟结束,在倒数第二的位置上得到一个新的最大数(其实在整个数列中第二大的数)。如此下去,重复以上过程,直至最终完成排序。
由于在排序过程中总是小数让前放,大数往后放,相当于气泡往上升,所以称作为冒泡排序。
下面,我们来看一个例子:
#include <stdio.h> #define MAXSIZE 10; typedef struct{ int r[MAXSIZE+1]; 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; }; void BubbleSort0(SqList *L){ int i,j; for(i=0;i<L->length;i++){ for(j=i+1;j<=L->length;j++){ if(L->r[i]>L-r[j]){ swap(L,i,j); } } } };
上面一个例子的排序方式是,通过数组的第一数和其它进行比较,如果大于下面的数组,则交换该位置上的值,最终让小的数据放到前面,
具体步骤是,当第1个数比第2个数大时,则交换它两的值,那么,此时,1位置上的值肯定是小的。
然后,1位置上的值在和第3个数进行比较,如果大,则继续交换,通过这个我们知道,在交换之后,我们唯一认为有意义的就是最上的的值,肯定是最小值,在交换过程中,那些中间值的顺序是没有关系的。
下面给出java版本的:
public class TestBubbleSort0 { public static void main(String args[]) { int a[] = {43, 54, 12, 65, 24, 123, 65, 42, 56, 221}; for (int i = 0; i < a.length - 1; i++) { for (int j = i+1; j <= a.length - 1; j++) { if (a[i] > a[j]) { bubbleSort0(a, i, j); } } } for (int i = 0; i < a.length ; i++) { System.out.print(a[i] + " "); } } static void bubbleSort0(int a[], int i, int j) { int temp; temp = a[i]; a[i] = a[j]; a[j] = temp; } }
那为什么说这个版本是非标准版呢?
主要原因在于,不满足定义中 有关 "两两比较相邻记录",上述的比较中,从上至下,
在每次的循环中,上面位置的元素都要和下面位置的元素进行比较,所以,它们的比较式不相邻的。
我们在后面的文章中将给出标准版的冒泡排序。