向大端冒泡

  1. public class BubbleSort {
  2. public static <T extends Comparable<? super T>> void sort(T[] arr) {
  3. for (int i = 0, len = arr.length; i < len - 1; i++) {
  4. for (int j = 0; j < len - i - 1; j++) {
  5. if (arr[j].compareTo(arr[j + 1]) > 0) {
  6. swap(arr, j, j + 1);
  7. }
  8. }
  9. }
  10. }
  11.  
  12. private static void swap(Object[] arr, int i, int j) {
  13. if (i != j) {
  14. Object temp = arr[i];
  15. arr[i] = arr[j];
  16. arr[j] = temp;
  17. }
  18. }
  19.  
  20. private static void printArr(Object[] arr) {
  21. for (Object o : arr) {
  22. System.out.print(o);
  23. System.out.print("\t");
  24. }
  25. System.out.println();
  26. }
  27.  
  28. public static void main(String args[]) {
  29. Integer[] arr = {3, 5, 1, 7, 2, 9, 8, 0, 4, 6};
  30. printArr(arr);//3 5 1 7 2 9 8 0 4 6
  31. sort(arr);
  32. printArr(arr);//0 1 2 3 4 5 6 7 8 9
  33. }
  34. }

向小端冒泡

  1. public class BubbleSort {
  2. public static <T extends Comparable<? super T>> void sort(T[] arr) {
  3. for (int i = 0, len = arr.length; i < len - 1; i++) {
  4. for (int j = len - 1; j > i; j--) {
  5. if (arr[j-1].compareTo(arr[j])>0) {
  6. swap(arr,j - 1, j);
  7. }
  8. }
  9. }
  10. }
  11.  
  12. private static void swap(Object[] arr, int i, int j) {
  13. if (i != j) {
  14. Object temp = arr[i];
  15. arr[i] = arr[j];
  16. arr[j] = temp;
  17. }
  18. }
  19.  
  20. private static void printArr(Object[] arr) {
  21. for (Object o : arr) {
  22. System.out.print(o);
  23. System.out.print("\t");
  24. }
  25. System.out.println();
  26. }
  27.  
  28. public static void main(String args[]) {
  29. Integer[] arr = {3, 5, 1, 7, 2, 9, 8, 0, 4, 6};
  30. printArr(arr);//3 5 1 7 2 9 8 0 4 6
  31. sort(arr);
  32. printArr(arr);//0 1 2 3 4 5 6 7 8 9
  33. }
  34. }

鸡尾酒排序(来回排序)

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

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

  1. public class BubbleSort {
  2. public static <T extends Comparable<? super T>> void sort(T[] arr) {
  3. int low = 0;//low前面的已经排好序
  4. int high = arr.length - 1;//high后面的已经排好序
  5. while (low < high) {//俩指针相遇说明排序完毕
  6.  
  7. //正向冒泡
  8. for (int i = low; i < high; i++) {
  9. if (arr[i].compareTo(arr[i + 1]) > 0) {
  10. swap(arr, i, i + 1);
  11. }
  12. }
  13. high--;
  14.  
  15. //反向冒泡
  16. for (int j = high; j > low; j--) {
  17. if (arr[j - 1].compareTo(arr[j]) > 0) {
  18. swap(arr, j - 1, j);
  19. }
  20. }
  21. low++;
  22. }
  23. }
  24.  
  25. private static void swap(Object[] arr, int i, int j) {
  26. if (i != j) {
  27. Object temp = arr[i];
  28. arr[i] = arr[j];
  29. arr[j] = temp;
  30. }
  31. }
  32.  
  33. private static void printArr(Object[] arr) {
  34. for (Object o : arr) {
  35. System.out.print(o);
  36. System.out.print("\t");
  37. }
  38. System.out.println();
  39. }
  40.  
  41. public static void main(String args[]) {
  42. Integer[] arr = {3, 5, 1, 7, 2, 9, 8, 0, 4, 6};
  43. printArr(arr);//3 5 1 7 2 9 8 0 4 6
  44. sort(arr);
  45. printArr(arr);//0 1 2 3 4 5 6 7 8 9
  46. }
  47. }

  

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

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

  1. public class BubbleSort {
  2. public static <T extends Comparable<? super T>> void sort(T[] arr) {
  3. for (int i = 0, len = arr.length; i < arr.length; i++) {
  4. boolean hasChanged = false;
  5. for (int j = 0; j < len - i - 1; j++) {
  6. if (arr[j].compareTo(arr[j + 1]) > 0) {
  7. swap(arr, j, j + 1);
  8. hasChanged = true;
  9. }
  10. }
  11. if(!hasChanged) break;
  12. }
  13. }
  14.  
  15. private static void swap(Object[] arr, int i, int j) {
  16. if (i != j) {
  17. Object temp = arr[i];
  18. arr[i] = arr[j];
  19. arr[j] = temp;
  20. }
  21. }
  22.  
  23. private static void printArr(Object[] arr) {
  24. for (Object o : arr) {
  25. System.out.print(o);
  26. System.out.print("\t");
  27. }
  28. System.out.println();
  29. }
  30.  
  31. public static void main(String args[]) {
  32. Integer[] arr = {3, 5, 1, 7, 2, 9, 8, 0, 4, 6};
  33. printArr(arr);//3 5 1 7 2 9 8 0 4 6
  34. sort(arr);
  35. printArr(arr);//0 1 2 3 4 5 6 7 8 9
  36. }
  37. }

  

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

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

  1. public class BubbleSort {
  2. public static <T extends Comparable<? super T>> void sort(T[] arr) {
  3. for (int i = 0, len = arr.length, lastPosition = 0; i < len - 1; i = len - lastPosition - 1) {
  4. lastPosition = 0;
  5. for (int j = 0; j < len - i - 1; j++) {
  6. if (arr[j].compareTo(arr[j + 1]) > 0) {
  7. swap(arr, j, j + 1);
  8. lastPosition = j;
  9. }
  10. }
  11. }
  12. }
  13.  
  14. private static void swap(Object[] arr, int i, int j) {
  15. if (i != j) {
  16. Object temp = arr[i];
  17. arr[i] = arr[j];
  18. arr[j] = temp;
  19. }
  20. }
  21.  
  22. private static void printArr(Object[] arr) {
  23. for (Object o : arr) {
  24. System.out.print(o);
  25. System.out.print("\t");
  26. }
  27. System.out.println();
  28. }
  29.  
  30. public static void main(String args[]) {
  31. Integer[] arr = {3, 5, 1, 7, 2, 9, 8, 0, 4, 6};
  32. printArr(arr);//3 5 1 7 2 9 8 0 4 6
  33. sort(arr);
  34. printArr(arr);//0 1 2 3 4 5 6 7 8 9
  35. }
  36. }

  

冒泡排序及优化(Java实现)的更多相关文章

  1. Java 排序算法-冒泡排序及其优化

    Java 排序算法-冒泡排序及其优化 什么是冒泡排序 基本写法 优化后写法 终极版本 源码及测试 什么是冒泡排序 这里引用一下百度百科上的定义: 冒泡排序(Bubble Sort),是一种计算机科学领 ...

  2. 怎么优化JAVA程序的执行效率和性能?

    现在java程序已经够快的了,不过有时写出了的程序效率就不怎么样,很多细节值得我们注意,比如使用StringBuffer或者StringBuilder来拼接或者操作字符串就比直接使用String效率高 ...

  3. Tomcat 优化 java.lang.OutOfMemoryError: Java heap space 的解决方法

    Tomcat 优化 java.lang.OutOfMemoryError: Java heap space 的解决方法 java.lang.OutOfMemoryError: Java heap sp ...

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

    本文由CrowHawk翻译,是Java GC调优的经典佳作. 本文翻译自Sangmin Lee发表在Cubrid上的"Become a Java GC Expert"系列文章的第三 ...

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

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

  6. jvm系列(十):如何优化Java GC「

    转自:https://www.cnblogs.com/ityouknow/p/7653129.html 本文由CrowHawk翻译,地址:如何优化Java GC「译」,是Java GC调优的经典佳作. ...

  7. 冒泡排序优化JAVA

    本文对传统的冒泡排序进行了一些优化,减少了循环次数. 时间复杂度 若文件的初始状态是正序的,一趟扫描即可完成排序.所需的关键字比较次数 C 和记录移动次数 M 均达到最小值: C(min)=n-1 , ...

  8. 【Java】 大话数据结构(14) 排序算法(1) (冒泡排序及其优化)

    本文根据<大话数据结构>一书,实现了Java版的冒泡排序. 更多:数据结构与算法合集 基本概念 基本思想:将相邻的元素两两比较,根据大小关系交换位置,直到完成排序. 对n个数组成的无序数列 ...

  9. 冒泡排序,冒泡性能优化--java实现

    冒泡排序说明: 一次比较两个元素,如果他们的顺序错误就把他们交换过来. 重复地进行直到没有再需要交换,也就是说已经排序完成. 越小的元素会经由交换慢慢“浮”到数列的顶端. 冒泡排序算法的运作如下: 比 ...

随机推荐

  1. Oracle 11g数据库安装和卸载教程

    Oracle11g的安装教程 同时解压缩两个zip文件,生成一个database文件夹,进入到database文件夹,点击setup 去掉安全更新的选项,直接下一步 选择创建和配置数据库,点击下一步 ...

  2. PlateSpin备份服务器时SQL Server的一些活动信息

      以前写过一篇文章IO is frozen on database xxx, No user action is required", 主要是介绍PlateSpin在服务器层面做DR备份时 ...

  3. QRCode 扫描二维码、扫描条形码、相册获取图片后识别、生成带 Logo 二维码、支持微博微信 QQ 二维码扫描样式

    目录 功能介绍 常见问题 效果图与示例 apk Gradle 依赖 布局文件 自定义属性说明 接口说明 关于我 功能介绍 根据之前公司的产品需求,参考 barcodescanner 改的,希望能帮助到 ...

  4. 学习笔记︱Nvidia DIGITS网页版深度学习框架——深度学习版SPSS

    DIGITS: Deep Learning GPU Training System1,是由英伟达(NVIDIA)公司开发的第一个交互式深度学习GPU训练系统.目的在于整合现有的Deep Learnin ...

  5. 用dd实现linux硬盘备份

    一个去年的老本,500G硬盘,空间各种捉急,准备迁移到公司的台式机上,却发现Linux上迁移环境没有Windows下那么方便,只能复制整块硬盘了. 从公司拿了一块1T的硬盘,插入移动硬盘盒(淘宝上搞的 ...

  6. 通过ajax记录网站UV、PV数

    1.通过jquery记录网站UV.PV数据 util.track = { log: function () { var referrer = util.browser.getReferrer(), h ...

  7. MessageFormat.format用法

    用法一: package gacl.request.study; import java.io.IOException; import java.text.MessageFormat; import ...

  8. 一:学习Linux前准备工作

    1:虚拟机,网站上有很多种类的虚拟机,找一款适合自己用的.我这里使用的是 Virtual Box 下载地址:https://www.virtualbox.org/ 安装虚拟机 一路 Next 就可以. ...

  9. 浏览器之window对象--javascript

    window对象代表打开的浏览器窗口,是Web浏览器所有内容的主容器.window对象是整个对象链条结构的最高层,是其他对象的父对象,在调用window对象的方法和属性时,可以省略window对象的引 ...

  10. Keras官方中文文档:Keras安装和配置指南(Linux)

    关于计算机的硬件配置说明 推荐配置 如果您是高校学生或者高级研究人员,并且实验室或者个人资金充沛,建议您采用如下配置: 主板:X299型号或Z270型号 CPU: i7-6950X或i7-7700K ...