经典排序法:冒泡排序法

从认识冒泡到现在已经4、5年了。按说应该掌握了这个经典排序算法。可是时间一长,就不知道怎么写了。今天认真地反思了一下。只能说自己并没有真正理解冒泡法的实质。这次为了彻底掌握冒泡法,决定先用一个例子,手写一遍整个过程,彻彻底底地看一下它的实质,再从中发现规律,弄明白是如何转化成代码的。
首先假设如下数组 int a[]={10,1,6,5}。将其从小到大排列。冒泡排列是将相邻的两个数进行比较。
下面是整个比较过程。

第一遍:
     10 -> 1 -> 6 -> 5 
     1 -> 10 -> 6 -> 5 

     1 -> 6 -> 10 -> 5

     1 -> 6 -> 5 -> 10
这样最大的数就排到最后一位了。
第二遍:
     1 -> 6 -> 5
     1 -> 6 -> 5
     1 -> 5 -> 6
这样最大的数就排到最后一位了。
第三遍:
     1 -> 5
     1 -> 5
这样最大的数就排到最后一位了。

整个排序过程就这样,我们从中发现了神马规律了呢?1.比较的遍数(或趟数)等于数组长度-1。2.看每一遍的比较过程发现,是两两比较,两两比较,前者比后者大的话,就交换位置。否则保持不变。代码表示怎么把它转化成代码表述出来呢?就是下面这段代码(Java实现):

if(a[j]>a[j+1]){
        temp=a[j];
        a[j]=a[j+1];
        a[j+1]=temp;
}

那每一遍比较到什么时候结束呢?就是j+1等于此遍进行比较的数组的最后一个位置,即j+1=a.length-i时。假设第i遍设为i。则每一遍比较的过程用代码就可表示如下(Java实现):

for(int j=0;j<a.length-i;j++){
            if(a[j]>a[j+1]){
                temp=a[j];
                a[j]=a[j+1];
                a[j+1]=temp;
            }
    }

最后遍历多少遍呢,通过上面的观察so easy 就能看出遍历的次数为数组的长度减一。所以最外面套个for循环即可。
完整的代码如下(Java实现):

int a[]={10,2,3,1,12,34,14,25};
        int temp;
        for(int i=1;i<a.length;i++){
            for(int j=0;j<a.length-i;j++){
                if(a[j]>a[j+1]){
                    temp=a[j];
                    a[j]=a[j+1];
                    a[j+1]=temp;
                }
            }
        }   
        for(int x : a){        //遍历输出排序后的数组
            System.out.println(x+" ");
        }   

看到这里不知道你是否明白,希望你不要此时明白,过了些日子就不明白了。如果真这样,恐怕你跟我犯的毛病就一样了:只看懂了皮毛,没有好好地钻研。完毕!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值