排序 - 冒泡排序(非标准版)

冒泡排序的基本概念:


依次比较相邻的两个数,将小的放在前面,大数放在后面。


即在第一趟:首先比较第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;
    }
}
 

那为什么说这个版本是非标准版呢?


主要原因在于,不满足定义中 有关 "两两比较相邻记录",上述的比较中,从上至下,


在每次的循环中,上面位置的元素都要和下面位置的元素进行比较,所以,它们的比较式不相邻的。



我们在后面的文章中将给出标准版的冒泡排序。

猜你喜欢

转载自alan-hjkl.iteye.com/blog/1579943
今日推荐