教育房产时事环球科技商业
投稿投诉
商业财经
热点动态
科技数码
软件应用
国际环球
晨报科学
新闻时事
信息智能
汽车房产
办公手机
教育体育
生活生物

冒泡排序法(详解冒泡排序)

  冒泡排序法(详解冒泡排序)
  要点
  冒泡排序是一种交换排序。
  什么是交换排序呢?
  交换排序:两两比较待排序的关键字,并交换不满足次序要求的那对数,直到整个表都满足次序要求为止。
  算法思想
  它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。
  这个算法的名字由来是因为越小的元素会经由交换慢慢"浮"到数列的顶端,故名。
  假设有一个大小为 N 的无序序列。冒泡排序就是要每趟排序过程中通过两两比较,找到第 i 个小(大)的元素,将其往上排。
  以上图为例,演示一下冒泡排序的实际流程:
  假设有一个无序序列 { 4. 3. 1. 2, 5 }
  第一趟排序:通过两两比较,找到第一小的数值 1 ,将其放在序列的第一位。
  第二趟排序:通过两两比较,找到第二小的数值 2 ,将其放在序列的第二位。
  第三趟排序:通过两两比较,找到第三小的数值 3 ,将其放在序列的第三位。
  至此,所有元素已经有序,排序结束。
  要将以上流程转化为代码,我们需要像机器一样去思考,不然编译器可看不懂。
  假设要对一个大小为 N 的无序序列进行升序排序(即从小到大)。
  (1) 每趟排序过程中需要通过比较找到第 i 个小的元素。
  所以,我们需要一个外部循环,从数组首端(下标 0) 开始,一直扫描到倒数第二个元素(即下标 N - 2) ,剩下最后一个元素,必然为最大。
  (2) 假设是第 i 趟排序,可知,前 i-1 个元素已经有序。现在要找第 i 个元素,只需从数组末端开始,扫描到第 i 个元素,将它们两两比较即可。
  所以,需要一个内部循环,从数组末端开始(下标 N - 1),扫描到 (下标 i + 1)。
  核心代码public void bubbleSort(int[] list) {
  int temp = 0; // 用来交换的临时数
  // 要遍历的次数
  for (int i = 0; i < list.length - 1; i++) {
  // 从后向前依次的比较相邻两个数的大小,遍历一次后,把数组中第i小的数放在第i个位置上
  for (int j = list.length - 1; j > i; j--) {
  // 比较相邻的元素,如果前面的数大于后面的数,则交换
  if (list[j - 1] > list[j]) {
  temp = list[j - 1];
  list[j - 1] = list[j];
  list[j] = temp;
  }
  }
  System.out.format("第 %d 趟:\t", i);
  printAll(list);
  }
  }
  冒泡排序算法的性能
  时间复杂度
  若文件的初始状态是正序的,一趟扫描即可完成排序。所需的关键字比较次数C和记录移动次数M均达到最小值:Cmin = N - 1, Mmin = 0。所以,冒泡排序最好时间复杂度为O(N)。
  若初始文件是反序的,需要进行 N -1 趟排序。每趟排序要进行 N - i 次关键字的比较(1 ≤ i ≤ N - 1),且每次比较都必须移动记录三次来达到交换记录位置。在这种情况下,比较和移动次数均达到最大值:
  Cmax = N(N-1)/2 = O(N2)
  Mmax = 3N(N-1)/2 = O(N2)
  冒泡排序的最坏时间复杂度为O(N2)。
  因此,冒泡排序的平均时间复杂度为O(N2)。
  总结起来,其实就是一句话:当数据越接近正序时,冒泡排序性能越好。
  算法稳定性
  冒泡排序就是把小的元素往前调或者把大的元素往后调。比较是相邻的两个元素比较,交换也发生在这两个元素之间。
  所以相同元素的前后顺序并没有改变,所以冒泡排序是一种稳定排序算法。
  优化
  对冒泡排序常见的改进方法是加入标志性变量exchange,用于标志某一趟排序过程中是否有数据交换。
  如果进行某一趟排序时并没有进行数据交换,则说明所有数据已经有序,可立即结束排序,避免不必要的比较过程。
  核心代码// 对 bubbleSort 的优化算法
  public void bubbleSort_2(int[] list) {
  int temp = 0; // 用来交换的临时数
  boolean bChange = false; // 交换标志
  // 要遍历的次数
  for (int i = 0; i < list.length - 1; i++) {
  bChange = false;
  // 从后向前依次的比较相邻两个数的大小,遍历一次后,把数组中第i小的数放在第i个位置上
  for (int j = list.length - 1; j > i; j--) {
  // 比较相邻的元素,如果前面的数大于后面的数,则交换
  if (list[j - 1] > list[j]) {
  temp = list[j - 1];
  list[j - 1] = list[j];
  list[j] = temp;
  bChange = true;
  }
  }
  // 如果标志为false,说明本轮遍历没有交换,已经是有序数列,可以结束排序
  if (false == bChange)
  break;
  System.out.format("第 %d 趟:\t", i);
  printAll(list);
  }
  }
  完整参考代码package notes.javase.algorithm.sort;
  import java.util.Random;
  public class BubbleSort {
  public void bubbleSort(int[] list) {
  int temp = 0; // 用来交换的临时数
  // 要遍历的次数
  for (int i = 0; i < list.length - 1; i++) {
  // 从后向前依次的比较相邻两个数的大小,遍历一次后,把数组中第i小的数放在第i个位置上
  for (int j = list.length - 1; j > i; j--) {
  // 比较相邻的元素,如果前面的数大于后面的数,则交换
  if (list[j - 1] > list[j]) {
  temp = list[j - 1];
  list[j - 1] = list[j];
  list[j] = temp;
  }
  }
  System.out.format("第 %d 趟:\t", i);
  printAll(list);
  }
  }
  // 对 bubbleSort 的优化算法
  public void bubbleSort_2(int[] list) {
  int temp = 0; // 用来交换的临时数
  boolean bChange = false; // 交换标志
  // 要遍历的次数
  for (int i = 0; i < list.length - 1; i++) {
  bChange = false;
  // 从后向前依次的比较相邻两个数的大小,遍历一次后,把数组中第i小的数放在第i个位置上
  for (int j = list.length - 1; j > i; j--) {
  // 比较相邻的元素,如果前面的数大于后面的数,则交换
  if (list[j - 1] > list[j]) {
  temp = list[j - 1];
  list[j - 1] = list[j];
  list[j] = temp;
  bChange = true;
  }
  }
  // 如果标志为false,说明本轮遍历没有交换,已经是有序数列,可以结束排序
  if (false == bChange)
  break;
  System.out.format("第 %d 趟:\t", i);
  printAll(list);
  }
  }
  // 打印完整序列
  public void printAll(int[] list) {
  for (int value : list) {
  System.out.print(value + "\t");
  }
  System.out.println;
  }
  public static void main(String[] args) {
  // 初始化一个随机序列
  final int MAX_SIZE = 10;
  int array = new int[MAX_SIZE];
  Random random = new Random;
  for (int i = 0; i < MAX_SIZE; i++) {
  array[i] = random.nextInt(MAX_SIZE);
  }
  // 调用冒泡排序方法
  BubbleSort bubble = new BubbleSort;
  System.out.print("排序前:\t");
  bubble.printAll(array);
  // bubble.bubbleSort(array);
  bubble.bubbleSort_2(array);
  System.out.print("排序后:\t");
  bubble.printAll(array);
  }
  }
  运行结果

韩庚卢靖姗恋情(韩庚卢靖姗有宝宝了吗)韩庚卢靖姗恋情(韩庚卢靖姗有宝宝了吗)奥斯瓦尔德施瓦茨说美满的婚姻是人生最大的幸福之一,不幸的婚姻无异于活着下地狱。一段不幸福的婚姻对于夫妻双方而言都是一种消耗。相反的,一段幸福的夏侯云姗(夏侯云姗出生年月日)夏侯云姗(夏侯云姗出生年月日)编剧与演员之间的关系亲密而又疏离,两者的共同点在于,他们获得满足感简单而直接编剧创作的剧本被演员塑造出人格,带观众或喜怒或哀乐,对人性的思考对未来的探扬子怎么样(扬子电暖风质量怎么样)中新经纬客户端4月28日电据上海市场监管局官网消息,近期,上海市市场监督管理局对本市生产销售的室内加热器产品质量进行了监督抽查。本次抽查了60批次产品,经检验,不合格6批次。上海市陶虹谈被当作过气女演员陶虹咋说的什么情况近日陶虹谈被当作过气女演员登录了热搜,也是在网上引起了网友们的关注,那么很多小伙伴可能还不清楚具体的情况如何,小编也是在网上查阅了一些信息,那么接下来就分享给大家来了解下陶虹谈被当陶虹生图(陶虹的恋爱史)陶虹生图(陶虹的恋爱史)4月30日,影后陶虹罕见露面,在机场与黄晓明偶遇,两人同框热聊笑意满满。陶虹身穿浅蓝色卫衣搭配牛仔裤,身形娇小玲珑,比黄晓明矮了大半个头。她的皮肤白嫩,神态10万左右最好的车是哪款(10万以下的车哪款好)随着汽车工业的发展,特别是国产品牌的崛起,以前很难想象一台十万以内的车也有高颜值和高配置,如今都变成了现实。今天我们推荐6款十万以内就能买到的车。长安欧尚X5厂商指导价6。9910增城是哪里(增城地图)今天请一起为增城打call!近日,由新华社瞭望东方周刊与瞭望智库共同主办的中国最具幸福感城市调查推选活动在北京启动。其中,在100个县级候选城市(区)中,广州增城区榜上有名。图片摄白水寨在哪里(增城白水寨瀑布)位于广州市增城区的白水寨,周末住市区的可以去走走。白水寨的人工瀑布其实就是水库的水,夏天去玩耍真的不错,天气炎热,水很清凉,树木茂盛。从广州市区开车到白水寨全程大概一个多小时,途径富阳怎么样(杭州富阳经济怎么样)都市快报讯未来的富阳会是什么样子?在日前举行的富阳区委常委会(扩大)会议上,富阳提出以成为杭州一核九星最具魅力的郊区新城为目标,着力唱好银湖科技城和杭州富春湾新城双城记,精心打造富富阳哪里好玩(富阳周边一日游)再次探访富阳龙鳞坝景区,百米长的富阳龙鳞坝将两个村落紧紧连接在一起,大坝的一头连接着新一村,而另一头则是新绿村。它虽然是一处小众景点,但自从建成后在网络上热度持续不减,以其独特的风武昌是哪里(现在可以去武汉玩吗)20日6时武汉市武昌江滩恢复开园。武汉市江滩办供图中新网武汉8月20日电(张芹廖宇智)因防汛需要关闭月余的武汉市武昌江滩20日6时恢复开园,当日清晨,市民有序入园游玩。自6月28日
毒海风暴在哪投资?成本多少?还能投资吗?我是影视顾问林经理18511098832(同v)了解更多影视资讯,鉴别渠道DYTZZW(v)专业的指导和意见,让你多一份安全保障片名毒海风暴电影类型警匪动作灾难监制高群书导演龙中华电影投资风险大吗?怎么参与?回报率如何?文章作者王世杰VFilm1788前言近年来,电影投资作为投资界黑马,占据了投资市场半壁江山!电影投资行业的发展正处于旺盛时期,成为了大家关注的焦点,在众多投资中独占鳌头!如果你想参亚联财小额贷款靠谱吗(亚联财起诉不理会)防骗课堂又来了,近期,有不少群众落入了虚假办理贷款诈骗的圈套,为进一步强化群众对电信网络诈骗的防范意识,崇仁公安结合身边现实案例,以案说法,针对虚假办理贷款诈骗常见诈骗进行防范讲解怎么理财才能存钱(怎么理财最划算)银行存款总体分为活期存款和定期存款,而定期存款分为普通定期存款和特殊定期存款除此之外,随着近几年民营银行成立,存款多了一项半定期半活期的的智能存款。如果按照这三种存款各有特点,从银小投资高回报(低投资高回报的生意)小投资高回报(低投资高回报的生意)一提起创业,相信绝大多数的人都会想到北上广深这几个超一线城市,顶多会提提像杭州成都这样的发展较好的城市。虽然大家都知道这些大城市机会多,但与此相对小笑话爆笑(12个让人瞬间爆笑的小笑话)小笑话爆笑(12个让人瞬间爆笑的小笑话)见字第508期哈哈哈哈哈哈哈01hr愚公临死前,把儿子叫到床前。愚公移山移山!儿子亮晶晶?愚公卒。02hr我之前得过精神分裂症,后来我们康复有关重庆的方言俚语俗语(重庆方言俚语俗语的文化内涵)有关重庆的方言俚语俗语(重庆方言俚语俗语的文化内涵)重庆方言俚语俗语与地方文化有着密切的关系,它既是地方文化的反映,同时又是对地方文化新的传承。俚语俗语具有通俗性,但是,我们要认识现在做什么生意好做投资小(开什么公司投资小)这是一个粉丝的问题。对于农村创业者我有感情,他们的问题我总是在第一时间回复,因为我也是从农村走出来的创业者,具备浓厚的乡土情结。现在在农村办一个小厂,有哪些投资小利润大,发展前景比5万怎么理财(十万闲钱放哪里收益高)你不理财,财不理你!投资理财是件大事情,要认真地对待。除非你特有钱,不把钱当回事,那么你也许就会投资理财了。钱多钱少无所谓,投资理财意识要有,大的观点理念战略基本相同,不同的只是具建信货币怎么样(建信闲钱佳)根据建信基金提供的数据显示,去年末,建信基金公募管理规模为1216亿元,那么今年一季度该公司的公募管理规模就缩水了235亿元。理财周报记者郭建鹏北京报道尽管基金公司一季报还未完全发怎么样网上赚钱(网上怎么赚钱最靠谱)现在是互联网的时代,所以有很多朋友想要自主创业,可能会优先考虑选择互联网的一些项目,但是在选择项目的时候,有一些朋友确实很烦恼,所以想要求助大家知不知道网上怎么赚钱快?1拍视频小视