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

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

  冒泡排序法(详解冒泡排序)
  要点
  冒泡排序是一种交换排序。
  什么是交换排序呢?
  交换排序:两两比较待排序的关键字,并交换不满足次序要求的那对数,直到整个表都满足次序要求为止。
  算法思想
  它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。
  这个算法的名字由来是因为越小的元素会经由交换慢慢"浮"到数列的顶端,故名。
  假设有一个大小为 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);
  }
  }
  运行结果

四川男老师十年猥亵20多名男学生近日四川男老师十年猥亵20多名男学生登录了热搜,也是在网上引起了网友们的关注,那么很多小伙伴可能还不清楚具体的情况如何,小编也是在网上查阅了一些信息,那么接下来就分享给大家来了解下踹伤猥亵男男生被解除刑拘这两天关于踹伤猥亵男男生被解除刑拘在网上的热度是非常高的,很多网友们也都是非常关注踹伤猥亵男男生被解除刑拘这个事情,为此小编也是在网上进行了一番搜索查阅相关的信息,那么如果说有感兴永州踹伤猥亵男男生被解除刑拘近日永州踹伤猥亵男男生被解除刑拘答案登录了热搜,也是在网上引起了网友们的关注,那么很多小伙伴可能还不清楚具体的情况如何,小编也是在网上查阅了一些信息,那么接下来就分享给大家来了解下男生踹伤猥亵男全程近日男生踹伤猥亵男全程登录了热搜,也是在网上引起了网友们的关注,那么很多小伙伴可能还不清楚具体的情况如何,小编也是在网上查阅了一些信息,那么接下来就分享给大家来了解下男生踹伤猥亵男电镀污水(电镀废水蒸发处理)电镀污水(电镀废水蒸发处理)五金电镀废水是电镀行业常见工业废水,对于此类废水要进行无害化处理,达标排放。五金电镀废水处理怎么办?下面请看小编的具体介绍。一五金电镀废水特点及危害五金科学探秘(科学探秘内容)科学探秘(科学探秘内容)闪电,有线形带状火箭形和球形四种。最常见的是线形,而球形闪电却很少出现。球形闪电俗称滚地雷,是一个呈圆球形的闪电球。球形闪电一般是直径1050厘米的火球,呈什么是医疗器械(医疗器械上的标识符号)点击右上角加,全国产经信息不错过导读医疗器械唯一标识(即UDI)是医疗器械的身份证,由产品标识(DI)和生产标识(PI)组成。根据医疗器械唯一标识系统规则,医疗器械上市许可人应当按告白失败大喊王俊凯来了近日告白失败大喊王俊凯来了登录了热搜,也是在网上引起了网友们的关注,那么很多小伙伴可能还不清楚具体的情况如何,小编也是在网上查阅了一些信息,那么接下来就分享给大家来了解下告白失败大无视一切包下款的贷款(全国接单包装贷款无前期费用)2020年最新口子郑重承诺1无前期无前期真正做到无任何前期费用创业贷50300万签10年免还协议公司专业的团队为您提供一对一跟踪办理确保百分之百下款如客户自身资质无法达到金融公司进西部航空公司(西部航空公司客服电话)西部航空公司(西部航空公司客服电话)5月23日,重庆。蒙蒙细雨润大地,芳草萋萋万物生。群山之巅,西藏。格桑花开天路美,渝藏情深心连心。图前往拉萨的旅客们向西藏同胞送上祝福。13点2今日巴金回收价多少,巴金小说温州回收苯乙烯价格今已更新。长期回收各地贵金属。立足江浙沪业务辐,上门回收,一直深受广大客户的欢迎。在能满足企事业单位对生产性废料及淘汰物资处理的要求下。价格在元左右,MACD及R
wps打印预览在哪里(wps如何打印预览发给别人)对于WPS表格大家应该都不陌生,不管工作还是生活中,都能经常用的到。大部分时候为了方便大家查看,做好的WPS表格一般都需要打印出来。在打印表格的时候,最常见的情况就是同一个表格被打幻灯片如何打印(wps幻灯片如何打印)点击右上角绘威打印,我专业,您放心!PPT是我们平时常见的文件格式之一,一般的汇报工作教育培训都离不开它。有时候我们也会需要将PPT打印出来,但打印效果往往不满意,那今天小绘就来盘wps表格怎么打印(wps做完表格怎么调整打印)平时我们在做表格的时候,往往不会关心表格到底有多长,是不是一页纸能装得下,数据多的时候一般表格会很长,电子版的看起来倒是没什么问题,直接拖动滚动条往下看就好了,但是打印出来就不一样wps分页符怎么去掉(pdf怎么合并成一页打印)一份文件中的多张页面合为一页?最近,小小迅在和亲爱的用户们交流的时候发现一个问题许多用户以为迅读的PDF合并功能可以将一份文件的多个页面合并为一页。(文件合并需要2份文件及以上)(拔智齿疼多久(拔智齿最痛是哪一天)俗话说,牙疼不是病,疼起来要人命,果不其然。真的是身有体会的人,才能感受到这句话的真理。有的人害怕拔牙,尤其是智齿,听说很难拔,自己便吃点止痛药,缓解一下,但是不能每次都靠吃药,不螃蟹什么季节最好吃(1月份吃公螃蟹还是母螃蟹)随着秋天的到来,很多植物进入了休息的季节,市面上的青菜少之又少,所以价格也是上涨了不少。虽然秋天的绿色青菜比较少,但是肉类鱼类还是很多的,经常可以在我们的餐桌上看到。如果你问身边人怎么吃螃蟹(螃蟹哪里不能吃高清图)吃螃蟹时,懂的人从来不吃这7个部位,不仅难吃,还有害。随着生活水平的提高,普通百姓人家也能吃得起螃蟹了。古人描写螃蟹的诗句也很多,李白曾经写过蟹螯即金液,糟丘是蓬莱,且须饮美酒,乘螃蟹怎么养(螃蟹用什么水养)水产人都会的公众号帮邦水产开启养殖调水培训课程,定期邀请行业大咖及实战高手讲解调水问题,扫描下方二维码,备注养殖品种即可拉您入群。大闸蟹养殖养殖水体水质调控方法1定期使用微生物制剂钓鲫鱼用什么小药(自制最强钓鲫鱼小药配方)配方是指通过各种物质(或者成分)组合得到的配比方法。就拿钓鱼来说,大家常说的老三样(野战蓝鲫九一八和速攻)按照一定的比例组合成来就是一款钓鲫鱼的配方。随着钓鱼钓鱼运动的发展,钓鲫鱼如何野钓鲫鱼(钓鲫鱼秘诀)大家好!现在天气逐渐转凉,有些新钓友已经开始封竿,准备来年再战了,但是老钓手们嘿嘿一乐,小子还是年轻啊,就这个时候才好钓鱼呢。因为温度!一降,小杂鱼活动减少,食欲降低,而大鱼要因为怎么样钓鲫鱼(诱鲫鱼最快的窝料配方)鲫鱼是杂食鱼,又是底栖鱼,所以食口非常杂,只要能被鲫鱼吞咽的物体,鲫鱼都会张口吞食,这也是鲫鱼口脏的由来。因此,想要钓鲫鱼,不管是钓饵,还是窝料,其实都不需要特别的讲究,而钓鱼用的