Java算法--冒泡排序

开发者博客www.developsearch.com

 

 

冒泡排序可以算是最经典的排序算法了,记得小弟上学时最先接触的也就是这个算法了,因为实现方法最简单,两层 for 循环,里层循环中判断相邻两个元素是否逆序,是的话将两个元素交换,外层循环一次,就能将数组中剩下的元素中最小的元素“浮”到最前面,所以称之为冒泡排序。

照例举个简单的实例吧:

  1.  
  2.  
  3. 初始状态:   [2419263936731293823]  
  4.  
  5. 内层第一趟: [24192639367312923 , 38 ] ( 9th [23]<->8th [38 )  
  6.  
  7. 内层第二趟: [241926393673123 , 29 , 38] ( 8th [23]<->7th [29] )  
  8.  
  9. 内层第三趟: [2419263936723 , 31 , 2938] ( 7th [23]<->6th [31] )  
  10.  
  11. 内层第四趟: [2419263936723312938] ( 7 、 23 都位于正确的顺序,无需交换)  
  12.  
  13. 内层第五趟: [241926397 , 36 , 23312938] ( 5th [7]<->4th [36] )  
  14.  
  15. 内层第六趟: [2419267 , 39 , 3623312938] ( 4th [7]<->3rd [39] )  
  16.  
  17. 内层第七趟: [24197 , 26 , 393623312938] ( 3rd [7]<->2nd [26] )  
  18.  
  19. 内层第八趟: [247 , 19 , 26393623312938] ( 2nd [7]<->1st [19] )  
  20.  
  21. 内层第九趟: [7 , 24 , 1926393623312938] ( 1st [7]<->0th [24] )  
  22.  
  23. ……… 

其实冒泡排序跟选择排序比较相像,比较次数一样,都为 n * (n + 1) / 2 ,但是冒泡排序在挑选最小值的过程中会进行额外的交换(冒泡排序在排序中只要发现相邻元素的顺序不对就会进行交换,与之对应的是选择排序,只会在内层循环比较结束之后根据情况决定是否进行交换),所以在我看来,选择排序属于冒泡排序的改进版。

实现代码:

 

/**  
 * Bubble Sorting, it's very similar with Insertion Sorting  
 */ 
BUBBLE(new Sortable() {  
    public <T extends Comparable<T>> void sort(T[] array, boolean ascend) {  
        int length = array.length;  
        int lastExchangedIdx = 0;  
        for (int i = 0; i < length; i++) {  
            // mark the flag to identity whether exchange happened to false  
            boolean isExchanged = false;  
            // last compare and exchange happened before reaching index i  
            int currOrderedIdx = lastExchangedIdx > i ? lastExchangedIdx : i;  
            for (int j = length - 1; j > currOrderedIdx; j--) {  
                int compare = array[j - 1].compareTo(array[j]);  
                if (compare != 0 && compare > 0 == ascend) {  
                    exchange(array, j - 1, j);  
                    isExchanged = true;  
                    lastExchangedIdx = j;  
                }  
            }  
            // if no exchange happen means array is already in order  
            if (isExchanged == false) {  
                break;  
            }  
        }  
    }  
}) 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值