经典算法系列之:冒泡排序

1、前言

算法,在计算机中的地位,就相当于人类大脑的决策中枢系统,哪怕最简单的算法,其精妙的思维方式,都可以让人开启一扇新的视窗。

算法,它不仅仅只是狭义的用来解决计算机科学领域的问题,更是一种“思维方式”。算法思维,是一种深度思考和创造的过程。

算法,只有真正理解了,而不只是所谓的知道,并将应用到生活、工作、学习等各个方面,它将一定使人受益终生。

2、原理推导

冒泡排序,就是相邻的两个元素比较,把小的元素往前调或者把大的元素往后调,实现元素的顺序排列。

给定一组 {9,7,1,5,8,6} 的原始无序数组,按照从小到大升序排列。

#step1

第一个数字和第二个数字开始两两比较,数字 【7】 和 【9】 位置互换,完成第一轮的第一次排序。

#step2

第二个数字和第三个数字开始两两比较,数字 【1】 和 【9】 位置互换,完成第一轮的第二次排序。

#step3

第三个数字和第四个数字开始两两比较,数字 【5】 和 【9】 位置互换,完成第一轮的第三次排序。

#step4

第四个数字和第五个数字开始两两比较,数字 【8】 和 【9】 位置互换,完成第一轮的第四次排序。

#step5

第五个数字和第六个数字开始两两比较,数字 【6】 和 【9】 位置互换,完成第一轮的第五次排序。

至此,第一轮排序已经完成结果为:{7,1,5,8,6,9} ,找到了最大的数字为【9】,通过两两比较将它排在数组的最后位置,接下来还有四轮排序,思路以此类推循环比较。

3、代码示例

public static void bubbleSort(int[] array){        
    //外层循环控制比较的次数,比较次数为总长度减 1        
    for(int i=array.length-1;i>0;i--){            
        //内层循环依次取出前后比较的数据,j<i 减去了已经排好序的数据         
        for(int j=0;j<i;j++){                
            // 相邻的两个数比较,小数值排在前面,前后交换位置,升序排列                
            if(array[j] > array[j+1]){                    
                int temp = array[j];                    
                array[j] = array[j+1];                   
                array[j+1] = temp;                
            }           
        }        
    }    
}

4、禅定时刻

穷举法,在计算机中是一种非常普通,且时间复杂度很高解决问题的途径,但它在对时间效率要求高的场景中应用,就不合适了,它的优点就是简单,便于理解,不容易遗漏。

冒泡排序的穷举思路,类似于麦肯锡公司的巴巴拉·明托在金字塔原理提出分析问题的“MECE分析法”,即“相互独立,完全穷尽”。

也就是对于一个问题,能够做到不重叠、不遗漏的分类,而且能够借此有效把握问题的核心,并成为有效解决问题的方法。

生活和工作中,当我们遇到重大难以抉择的问题的时候,MECE分析法将所有可能的情况都分别列举,相互比较,择优选择,这或许是我们拆解疑难问题,寻找解决方案比较有效的一种方式。

作者简介

思维的持续,一个真的有思想,不穿格子衬衫的程序员。

猜你喜欢

转载自www.cnblogs.com/swdcx/p/11790483.html
今日推荐