向大端冒泡

public class BubbleSort {public static <T extends Comparable<? super T>> void sort(T[] arr) {for (int i = 0, len = arr.length; i < len - 1; i++) {for (int j = 0; j < len - i - 1; j++) {if (arr[j].compareTo(arr[j + 1]) > 0) {swap(arr, j, j + 1);}}}}private static void swap(Object[] arr, int i, int j) {if (i != j) {Object temp = arr[i];arr[i] = arr[j];arr[j] = temp;}}private static void printArr(Object[] arr) {for (Object o : arr) {System.out.print(o);System.out.print("\t");}System.out.println();}public static void main(String args[]) {Integer[] arr = {3, 5, 1, 7, 2, 9, 8, 0, 4, 6};printArr(arr);//3  5   1   7   2   9   8   0   4   6sort(arr);printArr(arr);//0    1   2   3   4   5   6   7   8   9}
}

向小端冒泡

public class BubbleSort {public static <T extends Comparable<? super T>> void sort(T[] arr) {for (int i = 0, len = arr.length; i < len - 1; i++) {for (int j = len - 1; j > i; j--) {if (arr[j-1].compareTo(arr[j])>0) {swap(arr,j - 1, j);}}}}private static void swap(Object[] arr, int i, int j) {if (i != j) {Object temp = arr[i];arr[i] = arr[j];arr[j] = temp;}}private static void printArr(Object[] arr) {for (Object o : arr) {System.out.print(o);System.out.print("\t");}System.out.println();}public static void main(String args[]) {Integer[] arr = {3, 5, 1, 7, 2, 9, 8, 0, 4, 6};printArr(arr);//3  5   1   7   2   9   8   0   4   6sort(arr);printArr(arr);//0    1   2   3   4   5   6   7   8   9}
}

鸡尾酒排序(来回排序)

例子来自百度:以序列(2,3,4,5,1)为例,鸡尾酒排序只需要访问两次(升序降序各一次 )次序列就可以完成排序,但如果使用冒泡排序则需要四次。

普通冒泡和鸡尾酒都是交换了4次,但是鸡尾酒是遍历了2遍数组,也就是读取了10个数;而冒泡排序遍历了4遍数组,也就是读取了20个数。

public class BubbleSort {public static <T extends Comparable<? super T>> void sort(T[] arr) {int low = 0;//low前面的已经排好序int high = arr.length - 1;//high后面的已经排好序while (low < high) {//俩指针相遇说明排序完毕//正向冒泡for (int i = low; i < high; i++) {if (arr[i].compareTo(arr[i + 1]) > 0) {swap(arr, i, i + 1);}}high--;//反向冒泡for (int j = high; j > low; j--) {if (arr[j - 1].compareTo(arr[j]) > 0) {swap(arr, j - 1, j);}}low++;}}private static void swap(Object[] arr, int i, int j) {if (i != j) {Object temp = arr[i];arr[i] = arr[j];arr[j] = temp;}}private static void printArr(Object[] arr) {for (Object o : arr) {System.out.print(o);System.out.print("\t");}System.out.println();}public static void main(String args[]) {Integer[] arr = {3, 5, 1, 7, 2, 9, 8, 0, 4, 6};printArr(arr);//3    5   1   7   2   9   8   0   4   6sort(arr);printArr(arr);//0    1   2   3   4   5   6   7   8   9}
}

  

冒泡优化1:用标记位提前判断有序性

在数组基本有序时,如果经过少数趟冒泡后,发现已经顺序了,则不必循环完n-1次才结束,这时已经可以立即停止排序了。

public class BubbleSort {public static <T extends Comparable<? super T>> void sort(T[] arr) {for (int i = 0, len = arr.length; i < arr.length; i++) {boolean hasChanged = false;for (int j = 0; j < len - i - 1; j++) {if (arr[j].compareTo(arr[j + 1]) > 0) {swap(arr, j, j + 1);hasChanged = true;}}if(!hasChanged) break;}}private static void swap(Object[] arr, int i, int j) {if (i != j) {Object temp = arr[i];arr[i] = arr[j];arr[j] = temp;}}private static void printArr(Object[] arr) {for (Object o : arr) {System.out.print(o);System.out.print("\t");}System.out.println();}public static void main(String args[]) {Integer[] arr = {3, 5, 1, 7, 2, 9, 8, 0, 4, 6};printArr(arr);//3 5   1   7   2   9   8   0   4   6sort(arr);printArr(arr);//0    1   2   3   4   5   6   7   8   9}
}

  

冒泡优化2:记录下最后一次交换的位置j,表示j后面已经排好序

随时地变更i,即还需要遍历的次数在不断变更。普通冒泡排序每一趟排序只能减少1个数字的遍历规模(也就是i++),但是记录最后交换位置后,每次可以减少多个数字(也就是i = len - lastPosition - 1)。

public class BubbleSort {public static <T extends Comparable<? super T>> void sort(T[] arr) {for (int i = 0, len = arr.length, lastPosition = 0; i < len - 1; i = len - lastPosition - 1) {lastPosition = 0;for (int j = 0; j < len - i - 1; j++) {if (arr[j].compareTo(arr[j + 1]) > 0) {swap(arr, j, j + 1);lastPosition = j;}}}}private static void swap(Object[] arr, int i, int j) {if (i != j) {Object temp = arr[i];arr[i] = arr[j];arr[j] = temp;}}private static void printArr(Object[] arr) {for (Object o : arr) {System.out.print(o);System.out.print("\t");}System.out.println();}public static void main(String args[]) {Integer[] arr = {3, 5, 1, 7, 2, 9, 8, 0, 4, 6};printArr(arr);//3   5   1   7   2   9   8   0   4   6sort(arr);printArr(arr);//0    1   2   3   4   5   6   7   8   9}
}

  

转载于:https://www.cnblogs.com/noKing/p/7911594.html

冒泡排序及优化(Java实现)相关推荐

  1. java每轮排序结果,冒泡排序及其优化java

    java冒泡排序及其优化## version1 public static void bubbleSort() { int[] arr={5,6,1,4,3,2,7,8}: for (int i = ...

  2. java 鸡尾酒排序_冒泡排序及优化(Java实现)

    向大端冒泡 public class BubbleSort { public static > void sort(T[] arr) { for (int i = 0, len = arr.le ...

  3. Java的知识点18——数组存储表格数据、冒泡排序的基础算法、冒泡排序的优化算法、二分法查找

    数组存储表格数据 package cn.dym08; import java.util.Arrays; public class Test09 {public static void main(Str ...

  4. asp java 变量_ASP_用stack变量优化Java代码,  java程序包含了大量的对象 - phpStudy...

    用stack变量优化Java代码 java程序包含了大量的对象,我们需要了解它们是从哪里被访问的,变量存储于何处对程序的性能有显著的影响--尤其是某些需要被频繁访问的变量. 我们写一个Java类,在其 ...

  5. jvm 系列(九):如何优化 Java GC 「译」

    本文由CrowHawk翻译,地址:如何优化Java GC「译」,是Java GC调优的经典佳作. Sangmin Lee发表在Cubrid上的"Become a Java GC Expert ...

  6. 带哨兵的冒泡排序_冒泡排序的优化以及快排过程及优化

    冒泡排序的优化: 1.加入哨兵.2.记住每一次交换的最后位置,该位置以后的为有序,不需要改变. 1.快速排序的基本思想: 快速排序使用分治的思想,通过一趟排序将待排序列分割成两部分,其中一部分记录的关 ...

  7. jvm系列(十):如何优化Java GC「译」

    本文由CrowHawk翻译,地址:如何优化Java GC「译」,是Java GC调优的经典佳作. Sangmin Lee发表在Cubrid上的"Become a Java GC Expert ...

  8. 十大经典排序算法之冒泡排序及其优化

    一.冒泡排序 1.冒泡排序算法的原理如下: 1.比较相邻的元素.如果第一个比第二个大,就交换他们两个. 2.对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对.在这一点,最后的元素应该会是最大 ...

  9. java 堆大小的最大值_优化Java堆大小的5个技巧

    优化Java堆大小的5个技巧 摘要:Java堆容量不足可以对性能造成很大影响,这样无疑就给程序带来不可必要的麻烦,本文总结了影响Java堆容量不足的五大原因以及巧妙地去优化? 本文作者Pierre是一 ...

最新文章

  1. Selenium2+python自动化1(环境安装)
  2. 新版IntelliJ IDEA Web项目配置完整流程
  3. (7)C#里的线程和流
  4. 思科虚拟化与视频技术打造协作新体验
  5. WTM系列视频教程:先导篇
  6. c++中list容器
  7. Linux新加硬盘添加一个新的LVM磁盘组
  8. Velox将在Pangolin上启动其算法交易机器人,并计划推出更多DeFi解决方案
  9. 【POJ1679】The Unique MST(非严格次小生成树)
  10. ASP.NET 如何在网页中获取根目录
  11. windows下sakai配置过程
  12. android模拟器加速,给android模拟器加速
  13. java qq音乐接口 api,QQ音乐API分析(示例代码)
  14. python自动轨迹绘制七边形_斜抛运动的数学模型
  15. VUE图片裁剪,打码,旋转功能
  16. 计算机电缆检测报告,计算机用屏蔽双绞线DJYPVP-2*2*1.0mm²
  17. systemverilog : constraint slove... before 详解
  18. redis streams_如何构建Redis Streams应用程序
  19. android计算器开源小项目代码(附安装包.apk)
  20. linux lsiutil raid创建,使用Lsiutil在線管理Dell(R410,R610等)內置陣列卡SAS 6i/R

热门文章

  1. preferredsize JAVA_Java JScrollPane.getPreferredSize方法代码示例
  2. QT+CUDA7.5+UBUNTU14.04
  3. 利用深度学习从单个损伤和斑点中识别植物病害
  4. 快速安装Tensorflow
  5. idea通过svn上传_SVN客户端使用(Windows)图文详解
  6. yolo3做行人检测+deep-sort做匹配,端对端做多目标跟踪
  7. iis url重写 域名跳转子目录_IIS设置URL重写,实现页面的跳转的重定向方法
  8. oracle有几种类型表空间,oracle 数据创建时如何指定表空间类型
  9. php视图最佳实践,PHP 的最佳实践
  10. 模型房推荐_【自带水乐园】“巴洛克堡城”酒店,人均200+入住家庭房,乐享下午茶+自行车+游船+萌宠乐园!...