vlambda博客
学习文章列表

面试宝典 | 冒泡排序详解

冒泡排序在面试里面被考得不多,因为冒泡排序的性能并不好,平均时间复杂度是O(n²),实际应用并不多;其次,冒泡排序逻辑简单,如果人人都会的话,对于面试官来说就没有太多考试的必要,不能体现区分度。


但是我们还是需要了解其算法原理,只有清楚其原理、特性,才能知道每个算法的优势、劣势。万一面试官就是考这么简单的题目,而你没有答上来,岂不是很懊恼。赶快一起学习吧!


PART.
01  算法详解



算法思想

冒泡排序(Bubble Sort)要重复地走访过待排序的数列,一次比较两个元素,如果他们的大小顺序错误就把他们交换过来,直到排序完成。


面试宝典 | 冒泡排序详解
算法详解

以将数组按从小到大排序举例说明。冒泡排序有两种比较方法,一种是从前向后比较,一种是从后向前比较。以从前向后排序举例。


初始序列:

4 5 2 1


第一趟:

4 5 2 1    →    4 5 2 1    (4 < 5,不交换)

5 2 1    →    4 2 5 1    (5 > 2,交换)

4 2 5 1    →    4 2 1 5    (5 > 1,交换)

第一趟排序结束后,数字5被放到最终位置上。


第二趟:

4 2 1 5    →    2 4 1 5    (4 > 2,交换)

4 1 5    →    2 1 4 5    (4 > 1,交换)

第二趟排序结束后,数字4被放到最终位置上。


第三趟:

2 1 4 5    →    1 2 4 5    (2 > 1,交换)

第三趟排序结束后,数字2被放到最终位置上,数组变为有序,排序结束。


面试宝典 | 冒泡排序详解
算法实现(C/C++)
void bubbleSort(int A[],int n){    for(int i=0; i<n-1; i++){ // 共进行n-1趟冒泡        for(int j=0; j<n-i-1; j++){  //从前向后比较            if(A[j]>A[j+1]){                int tmp=A[j];                A[j]=A[j+1];                A[j+1]=tmp;            } // if        } // for    } // for} // BubbleSort


面试宝典 | 冒泡排序详解
算法实现(python)
def bubbleSort(arr): for i in range(1, len(arr)): for j in range(0, len(arr) - i): if arr[j] > arr[j + 1]: arr[j], arr[j + 1] = arr[j + 1], arr[j] return arr


面试宝典 | 冒泡排序详解
算法实现(golang)
func bubbleSort(arr []int) []int {    length := len(arr)    for i := 0; i < length; i++ {        for j := 0; j < length-1-i; j++ {            if arr[j] > arr[j+1] {                arr[j], arr[j+1] = arr[j+1], arr[j]            }        }    }    return arr}


面试宝典 | 冒泡排序详解
算法实现(js)
function bubbleSort(arr) {    var len = arr.length;    for (var i = 0; i < len - 1; i++) {        for (var j = 0; j < len - 1 - i; j++) {            if (arr[j] > arr[j+1]) {                var temp = arr[j+1];                arr[j+1] = arr[j];                arr[j] = temp;            }        }    }    return arr;}


PS:其他语言的代码实现非辣条妹擅长领域,就不班门弄斧了,建议大家去搜其他博客。


PART.
02  面试问题来了!



面试宝典 | 冒泡排序详解
冒泡排序最好、最坏、平均情况下的时间复杂度?

最好的情况,数组初始状态就是排序后的最终状态,时间复杂度为O(n);最坏情况,数组初始状态是逆序,时间复杂度为O(n²);平均情况时间复杂度为O(n²)。


冒泡排序是稳定的排序算法吗?

是的。


结语

冒泡排序属于比较类排序中的交换类排序,交换类排序中还有一个快速排序,面试中考得更多,下期即将推送。