看完了这篇,面试的时候人人都能单手撸冒泡排序!

开发 前端
冒泡排序属于比较简单的一种排序方法。但是,很多同学到现在也不能手写一个冒泡排序。甚至经过和一些刚毕业甚至工作一两年的朋友交流后,发现他们内心对算法,抱着深深的恐惧和盲目崇拜,觉得算法好像高不可攀,只适合那些高学历、高智商的人来学习和研究!

[[350530]]

鸡汤给大家备好了:

岁月流逝是多么残酷啊,对我们也是如此,不要把时间浪费在不重要的人和事情上!

在计算机科学中,排序是一个经典的主题。学习排序算法的好处有三:

1.创造性解决问题

2.练习和巩固程序设计技能

3.演示算法性能的极好例子

冒泡排序属于比较简单的一种排序方法。但是,很多同学到现在也不能手写一个冒泡排序。甚至经过和一些刚毕业甚至工作一两年的朋友交流后,发现他们内心对算法,抱着深深的恐惧和盲目崇拜,觉得算法好像高不可攀,只适合那些高学历、高智商的人来学习和研究!今天,我想把这篇献给他们,希望他们能树立起学习的勇气和信心!

1.什么是冒泡排序

冒泡排序算法需要遍历几次数组,在每次遍历中,比较连续相邻的元素。如果一对元素是降序排列,则互换他们的位置,否则保持不变。这样一来,使得较小的值像“气泡”一样,逐渐浮向顶部,而较大的值沉入底部,因此称这种排序方法为冒泡排序(bubble sort )或下沉排序(sinking sort)。

第一次遍历之后,最后一个元素将成为最大的元素。第二次遍历之后,倒数第二个元素,将成为倒数第二大的元素。整个过程持续到所有的元素全部都已排好序。

2.图解冒泡排序

经过第一次遍历后,最大的数已经在数组末尾。因为最后一个数已经是最大数,因此不需要再考虑最后一对元素。

经过第二次遍历,后两个数已经排好序,所以只需要对除它们之外的元素进行排序。

因此,在进行第n次遍历时,不需要考虑倒数第n-1个元素,因为它们已经排好序了!

冒泡排序伪代码:

  1. for(int k = 1; k < list.length; k++){ 
  2.     for(int j = 0; j < list.length-k; j++) { 
  3.         if(list[j] > list[j + 1]) { 
  4.             swap(list[i], list[i + 1]); 
  5.         } 
  6.     } 

3.改进后的冒泡排序

注意到,上面的排序实际上有很多次没有发生交换,因此,我们可以对冒泡排序稍微改进下:

  1. boolean nextPass = true
  2. for(int k = 1; k < list.length && nextPass; k++){ 
  3.     nextPass = false
  4.     for(int j = 0; j < list.length-k; j++) { 
  5.         if(list[j] > list[j + 1]) { 
  6.             swap(list[i], list[i + 1]); 
  7.             nextPass = true
  8.         } 
  9.     } 

4. 冒泡排序时间复杂度

最佳情况下,冒泡排序只需要一次遍历就能确定数组已排好序,不需要再进行下一次遍历。因此,最佳情况下,冒泡排序时间复杂度为O(n)。

最坏情况下,冒泡排序需要 次。因此比较总次数为: $$ (n-1) + (n-2) + (n-3) + ...+ 3 + 2 + 1 = ({\frac n2^2} - {\frac n2}) = O(n^2) $$ 所以,最坏情况下,冒泡排序的时间复杂度为:O(n^2)。

5. 附上函数

  1. public static void bubbleSort(int[] list) { 
  2.     boolean nextPass = true
  3.     for(int k = 1; k < list.length && nextPass; k++){ 
  4.         nextPass = false
  5.         for(int j = 0; j < list.length-k; j++) { 
  6.             if(list[j] > list[j + 1]) { 
  7.                 int tmp = list[j]; 
  8.                 list[j] = list[j+1]; 
  9.                 list[j+1] = tmp; 
  10.                 nextPass = true
  11.             } 
  12.         } 
  13.     } 
  14. }  

本文转载自微信公众号「锅外的大佬」,可以通过以下二维码关注。转载本文请联系锅外的大佬公众号。

 

责任编辑:武晓燕 来源: 锅外的大佬
相关推荐

2012-05-14 14:35:41

2020-05-28 11:36:13

数据仓库大数据架构

2021-03-18 11:45:49

人工智能机器学习算法

2020-05-19 14:00:09

人工智能机器学习AI

2022-11-21 07:58:10

Java排序冒泡排序

2021-06-29 11:40:51

Python邮件命令

2020-01-15 08:06:28

HTTP超文本传输协议网络协议

2021-05-08 07:53:33

面试线程池系统

2020-02-03 17:22:34

垃圾回收原理种类

2020-03-14 09:17:55

HTTPS网络协议HTTP

2020-07-05 09:12:42

java冒泡排序算法

2021-12-29 10:21:41

Linux 权限扩展名

2020-05-15 11:14:58

操作系统面试官运行

2019-10-30 08:53:46

JavaScript冒泡排序选择排序

2013-08-02 13:25:00

2011-04-20 14:07:37

冒泡排序

2018-04-23 11:00:44

PythonRedisNoSQL

2017-02-09 19:45:07

Linux系统Linux 发行版

2012-10-31 10:25:52

排序

2020-12-09 08:35:45

Shell脚本语法
点赞
收藏

51CTO技术栈公众号