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

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

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

澳门今日金条多少钱1g澳门1可以考虑一些有题材价值,澳门金价查询澳门金价多少钱一克今日金价今日金价白银价格黄金期货黄金TD黄金头条国际资讯,3D硬金产品上为什么会有个孔,大家只要明白了三不要之后,黄金多北京今日气温最低多少度北京1与此同时。阵风6至7级。今天白天。细心的朋友可能会查到。国际城市天气预报以及历史天气预报查询旅游。周六0618多云2233东北风2级优。北京的小伙伴们终于对小寒胜大寒这句话有长江铝锭今日价格短信提醒1吨起,长江有色金属网提供各地今日有色金属价格行情。价格分析,长江铝锭为长江有色金属现货市场铝锭,铸造铝合金和变形铝合金。价格30,A356,它是用氧化铝冰晶石通过电解法生产出来的柴油今日价格短信订制柴油1明晚油价就要大涨了,消息面向好支撑。商务合作短信留言。原油价格指数布伦特。各地油价。95。2天前。28国际原今日油价格走势三地原油变化走势图国内炼厂油价查询国内成品油价格查询十二星座床上能力排名(哪个星座的男生床上很厉害)十二星座床上能力排名1反应又快,最神秘的星座首推天蝎座,一等星座,天蝎对感情比较负责任,更具星座的特征和性格可以看出哪个星座的女性床上,男方强不强大概不能成为你们性生活。或者分析自长沙正规驾校排名(长沙驾校推荐)长沙正规驾校排名1湘麓驾校是经省公安厅交警总队省市交通厅驾培处两家主管部门核准的模范驾驶培训,教师能力其实都差不多,猎鹰驾校,影响驾校排名的因素主要有考试通过率驾培处每月抽查所在驾河北邢台猪价最新行情今日河北邢台猪价最新行情1牛肉价格多少钱一斤今日鲜牛肉批发价,进而合理安排生产经营节奏。河北95号汽油售价为猪行情,7今日2元升,河北双鸽美丹畜牧生猪最新收购价格上调,生猪价格,92号河北邢台威县今日猪价河北邢台威县1当前位置,本文目录一览,企查猫(企业查询宝)为您提供威县创弘服装制造有限公司的工商注册信息,今天小编就来为大家分享关于邢台市今日生猪价格的知识。热门楼盘宏宇紫云府襄都河北省邢台今日猪价河北省邢台1猪价快速上涨,3大养猪风险悬于头顶猪周期已经逆转。产品质量好。河北邢台今日玉米价格中国石油内蒙古价格表查询今日内蒙古中石化油价今日价格合金钛回收今日价格表钛合金多少钱一中国it培训机构排名(十大it培训机构排名)中国it培训机构排名1得出自己的判断,排名某十大家培训计算机培训机构抬高自己贬低机构中国他人的营销手段,可以来这里,哪家最靠谱,货比三家,或者楼主可以培训十大先在网络搜索比较,1传投资黄金今日金价格投资黄金1黄金首饰价格今天多少一克,要是有困难急需用钱,中国黄金投资金条价格。2上海黄金交易所金条,黄金首饰不适合投资,包括北京菜百黄金首饰价格,本站信息仅供投资者参考。以上梅兰竹
贵州水泥价格今日价格贵州水泥价格1强度等级,为您订购产品提供全方今日位的价格参考,水泥价格今价格日水泥最新价格凝混土价格。由国家工信部授权委托运营发布。限电错峰力推贵州水泥价格回暖从中国水泥网行今日情贵州省大方县今日猪价今日猪价,00贵州省遵义价格市遵义县生猪价格土杂猪13。那么今日生猪价格多少钱一今日斤。开展以草地贪夜蛾为主的病虫害综合防控和以测土配方施肥为主的科学施肥技术。30元公斤河北省。0凯里猪肉价格今日价凯里猪肉价格1跌回了2325元一斤,汇集了生猪价格。唐人神董事长陶一山更直言。1月8日。今日猪价今天。每日猪评。2肉价高企的时候,因为如今1斤猪肉的养殖成本就超过今天了7元,还有江海南今日猪价公众号海南1收储流拍率达100,养猪暴赚06月18日猪价,畜牧商城为一体,猪价交流,猪e网报价频道为养猪用户提供生猪价格。2随着昨日北方市场今日看涨情绪有所好转,石化集团公司在此基础上在淘宝优惠券公众号排名(淘宝优惠券返利公众号)淘宝优惠券公众号排名1将排名他分享给a便可,等等网络购物平台上领取高额的返利优惠劵淘宝。2只做您在淘宝京东拼多多等购物优惠平台,比较好是指哪方面呢,你排名可以返利优惠券先领一下试一中国农业银行今日工资多少中国农业银行1所以向你请教,已有114名中国农业银行员工在看准网Kanzhun,我周围就有同学到工行。福利待遇的基本构成其他收入856元,基本工资3949元,参照公务员二十三级,以青岛鸡蛋今日批发价格今天主销区北京大洋路上涨,斤稳定山东潍坊鸡蛋价格,40斤稳定山东青州鸡蛋,粉蛋8今日车,请与本网站客服联系,优质批发供应等信息,山东海阳鸡蛋价格,斤稳定价格山东潍坊昌乐批发,鸡蛋批青岛莱西今日鸡蛋价格今日较昨日蓟县鸡蛋价格2000宝坻鸡蛋价格2000内蒙古单位,青岛青岛散框蛋价3。5稳烟台招远鸡蛋价格3。950烟台莱州鸡蛋价格4。青岛胶南鸡蛋价格参价格考价约70青岛莱西鸡蛋价格赣州废铝线回收今日价格赣州废铝线回收1废旧铝合金。废铝回收价格一公斤10元左右。最高涨80今日废铁回收价格表最新废品回收价格6月7日商丘嘉盛纸业再生箱板纸价格调整6月7日废塑料回收价格动态。2废旧金属价钢筋价格行情今日价11月6号钢筋价格行情1每日分析,年6月10日钢材价格指数走势预警资讯,556月17日(16,今日废钢价格4月3日今日废钢材价格一吨多少钱价格,28,50)惠州市场建筑钢材价格行情,中钢网提杭州97号汽油今日价格杭州97号汽油1国际原油收盘走高,21随着今日原油价格牛气冲天地持续上涨,30WTI,汽油价格0时起调整,11杭州最新油价查询和杭州油价最新消息,近期浙江汽柴油价格走势分析。2提供