冒泡排序及优化(Java实现)
向大端冒泡
- 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 6
- sort(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 6
- sort(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 6
- sort(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 6
- sort(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 6
- sort(arr);
- printArr(arr);//0 1 2 3 4 5 6 7 8 9
- }
- }
冒泡排序及优化(Java实现)的更多相关文章
- Java 排序算法-冒泡排序及其优化
Java 排序算法-冒泡排序及其优化 什么是冒泡排序 基本写法 优化后写法 终极版本 源码及测试 什么是冒泡排序 这里引用一下百度百科上的定义: 冒泡排序(Bubble Sort),是一种计算机科学领 ...
- 怎么优化JAVA程序的执行效率和性能?
现在java程序已经够快的了,不过有时写出了的程序效率就不怎么样,很多细节值得我们注意,比如使用StringBuffer或者StringBuilder来拼接或者操作字符串就比直接使用String效率高 ...
- Tomcat 优化 java.lang.OutOfMemoryError: Java heap space 的解决方法
Tomcat 优化 java.lang.OutOfMemoryError: Java heap space 的解决方法 java.lang.OutOfMemoryError: Java heap sp ...
- jvm系列(十):如何优化Java GC「译」
本文由CrowHawk翻译,是Java GC调优的经典佳作. 本文翻译自Sangmin Lee发表在Cubrid上的"Become a Java GC Expert"系列文章的第三 ...
- jvm系列(七):如何优化Java GC「译」
本文由CrowHawk翻译,地址:如何优化Java GC「译」,是Java GC调优的经典佳作. Sangmin Lee发表在Cubrid上的”Become a Java GC Expert”系列文章 ...
- jvm系列(十):如何优化Java GC「
转自:https://www.cnblogs.com/ityouknow/p/7653129.html 本文由CrowHawk翻译,地址:如何优化Java GC「译」,是Java GC调优的经典佳作. ...
- 冒泡排序优化JAVA
本文对传统的冒泡排序进行了一些优化,减少了循环次数. 时间复杂度 若文件的初始状态是正序的,一趟扫描即可完成排序.所需的关键字比较次数 C 和记录移动次数 M 均达到最小值: C(min)=n-1 , ...
- 【Java】 大话数据结构(14) 排序算法(1) (冒泡排序及其优化)
本文根据<大话数据结构>一书,实现了Java版的冒泡排序. 更多:数据结构与算法合集 基本概念 基本思想:将相邻的元素两两比较,根据大小关系交换位置,直到完成排序. 对n个数组成的无序数列 ...
- 冒泡排序,冒泡性能优化--java实现
冒泡排序说明: 一次比较两个元素,如果他们的顺序错误就把他们交换过来. 重复地进行直到没有再需要交换,也就是说已经排序完成. 越小的元素会经由交换慢慢“浮”到数列的顶端. 冒泡排序算法的运作如下: 比 ...
随机推荐
- Oracle 11g数据库安装和卸载教程
Oracle11g的安装教程 同时解压缩两个zip文件,生成一个database文件夹,进入到database文件夹,点击setup 去掉安全更新的选项,直接下一步 选择创建和配置数据库,点击下一步 ...
- PlateSpin备份服务器时SQL Server的一些活动信息
以前写过一篇文章IO is frozen on database xxx, No user action is required", 主要是介绍PlateSpin在服务器层面做DR备份时 ...
- QRCode 扫描二维码、扫描条形码、相册获取图片后识别、生成带 Logo 二维码、支持微博微信 QQ 二维码扫描样式
目录 功能介绍 常见问题 效果图与示例 apk Gradle 依赖 布局文件 自定义属性说明 接口说明 关于我 功能介绍 根据之前公司的产品需求,参考 barcodescanner 改的,希望能帮助到 ...
- 学习笔记︱Nvidia DIGITS网页版深度学习框架——深度学习版SPSS
DIGITS: Deep Learning GPU Training System1,是由英伟达(NVIDIA)公司开发的第一个交互式深度学习GPU训练系统.目的在于整合现有的Deep Learnin ...
- 用dd实现linux硬盘备份
一个去年的老本,500G硬盘,空间各种捉急,准备迁移到公司的台式机上,却发现Linux上迁移环境没有Windows下那么方便,只能复制整块硬盘了. 从公司拿了一块1T的硬盘,插入移动硬盘盒(淘宝上搞的 ...
- 通过ajax记录网站UV、PV数
1.通过jquery记录网站UV.PV数据 util.track = { log: function () { var referrer = util.browser.getReferrer(), h ...
- MessageFormat.format用法
用法一: package gacl.request.study; import java.io.IOException; import java.text.MessageFormat; import ...
- 一:学习Linux前准备工作
1:虚拟机,网站上有很多种类的虚拟机,找一款适合自己用的.我这里使用的是 Virtual Box 下载地址:https://www.virtualbox.org/ 安装虚拟机 一路 Next 就可以. ...
- 浏览器之window对象--javascript
window对象代表打开的浏览器窗口,是Web浏览器所有内容的主容器.window对象是整个对象链条结构的最高层,是其他对象的父对象,在调用window对象的方法和属性时,可以省略window对象的引 ...
- Keras官方中文文档:Keras安装和配置指南(Linux)
关于计算机的硬件配置说明 推荐配置 如果您是高校学生或者高级研究人员,并且实验室或者个人资金充沛,建议您采用如下配置: 主板:X299型号或Z270型号 CPU: i7-6950X或i7-7700K ...