冒泡排序的前世今生:冒泡排序的前世今生

人气:305 ℃/2023-09-22 22:23:48

冒泡排序对于曾经是计算机相关专业的人来说,肯定不陌生,不但不应该陌生,反而应该很熟悉且有一种畏惧感,也许还会想起谭浩强?它是相对在学生时代比较难以理解的一个排序算法,往往作为考试的大题或老师的大招儿,虽然不是最复杂的算法,但可能会在比如C语言程序设计的最后几道题里。

在90年代末的大学生活中,宿舍中是很少有个人电脑的,上机需要去机房,计算机系的学生大学四年没怎么摸过计算机,这些并不奇怪,编程到底和我们的生活有什么关系,和如今的互联网时代大相径庭,大家是没有概念的。更不要说大家脑子里的冒泡排序了,这是干什么的,以后有什么用,没有它世界会怎样,老师没说过,我们也没想过,我猜老师也不知道吧……

以上问题隐隐约约跟随了我十多年,终于忍不住有一天上网搜了搜,结合实际工作和经验自己又思考了一些日子,算是对自己近半生的软件攻城狮生涯总要有个交代吧。1962年 Iverson, K. 在 A Programming Language. 首次使用了“冒泡排序(Bubble sort)”的名字。

冒泡排序的核心思想是“交换”二字,下面我贴上自己写的示例代码。为啥叫冒泡,也是交换二字吧,不停的交换比较大小,要得到的结果就好像泡泡一样一个个从水中浮现。实际应用类系统开发工作中,目前还没有遇到过应用的场景,冒泡排序的时间复杂度O(n²),空间复杂度O(1),我想时间复杂度不占便宜,那么是不是会在对空间要求比较苛刻的情况下会使用该算法呢?比如内存不是很大的情况下,同时元素又不是很多的时候。那么为什么冒泡被广泛的用于教学呢,我认为一是因为形象生动好玩,二是因为历史的惯性吧。

/** * 冒泡排序实现 * @param array * @param order * @return sortedArray */ public int[] bubbleSort(int[] array, ORDER order){ // 复制传入数组,保证原参数数组值不变 int[] sortedArray = Arrays.copyOf(array, array.length); // 遍历整个数组的次数控制 for (int i = 1; i < sortedArray.length; i ) { int count = 0;// 交换位置计数器初值为零 // 遍历整个数组的相邻元素依次比较、换位 for (int j = 0; j < sortedArray.length - i; j ) { int tmp = sortedArray[j]; switch (order) { case asc: // 升序方向换位 if (sortedArray[j] > sortedArray[j 1]) { sortedArray[j] = sortedArray[j 1]; sortedArray[j 1] = tmp; count ; // 计数器加代表换位次数 } break; case desc: // 降序方向换位 if (sortedArray[j] < sortedArray[j 1]) { sortedArray[j] = sortedArray[j 1]; sortedArray[j 1] = tmp; count ; // 计数器加代表换位次数 } break; } } // 若没有交换则退出整体遍历 if (count == 0) { break; } } return sortedArray; }

百科

More+
首页/电脑版/网名
© 2025 NiBaKu.Com All Rights Reserved.