向大端冒泡

public class BubbleSort {

public static > 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);//3517298046

sort(arr);

printArr(arr);//0123456789

}

}

向小端冒泡

public class BubbleSort {

public static > 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);//3517298046

sort(arr);

printArr(arr);//0123456789

}

}

鸡尾酒排序(来回排序)

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

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

public class BubbleSort {

public static > 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);//3517298046

sort(arr);

printArr(arr);//0123456789

}

}

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

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

public class BubbleSort {

public static > 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);//3517298046

sort(arr);

printArr(arr);//0123456789

}

}

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

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

public class BubbleSort {

public static > 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);//3517298046

sort(arr);

printArr(arr);//0123456789

}

}

java 鸡尾酒排序_冒泡排序及优化(Java实现)相关推荐

  1. java 鸡尾酒排序_算法渣-排序-冒泡

    没有一身好内功,招式再多都是空;算法绝对是防身必备,面试时更是不可或缺:跟着算法渣一起从零学算法 定义 冒泡排序(Bubble Sort),是一种计算机科学领域的较简单的排序算法. 这个算法的名字由来 ...

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

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

  3. Java 八大排序之冒泡排序详解

    Java 八大排序之冒泡排序详解 分析冒泡排序 数组[24,69,80,57,13] 第1轮排序:目标把最大数放在最后 第1 次比较:[24,69,80,57,13] 第2 次比较:[24,69,8 ...

  4. java python算法_用Python,Java和C ++示例解释的排序算法

    java python算法 什么是排序算法? (What is a Sorting Algorithm?) Sorting algorithms are a set of instructions t ...

  5. java 概率 算法_使用概率算法优化快速排序(JAVA)

    前言 前面一篇文章系统介绍了快速排序算法,提到快速排序虽然平均时间复杂度为o(n*log2(n)),效率相对比较高.但是其在特殊情况下,比如降序的情况下,效率和冒泡排序一致,这就削弱了快速排序给人的好 ...

  6. java sorted排序_【算法】排序算法之计数排序

    前几回,我们已经对冒泡排序.直接插入排序.希尔排序.选择排序.快速排序.归并排序.堆排序做了说明分析.本回,将对计数排序进行相关说明分析. 一.排序算法系列目录说明 冒泡排序(Bubble Sort) ...

  7. java实现排序(2)-冒泡排序

    引言 也许冒泡排序,一个刚出大学的的程序员可能写的出来,反而工作了几年的老程序员可能会写不出来,你还写的出来么?在本篇博文中,详细介绍了冒泡排序的概念,同时用数组和双向链表来实现,附带一种通俗的优化方 ...

  8. 冒泡排序及优化(Java实现)

    向大端冒泡 public class BubbleSort {public static <T extends Comparable<? super T>> void sort ...

  9. java comparator 降序排序_【转】java comparator 升序、降序、倒序从源码角度理解

    原文链接:https://blog.csdn.net/u013066244/article/details/78997869 环境 jdk:1.7+ 前言 之前我写过关于comparator的理解,但 ...

最新文章

  1. 对C语言程序进行编译时 针对以下情况,linux书上划的题的答案.doc
  2. Chapter12:动态内存
  3. easyui中 在子tabs中 添加新的tabs
  4. 独家|OpenCV 1.1 Mat - 基本图像容器(附链接)
  5. 在Ring3上实现文件碎甲(解锁)功能
  6. Java基础08 继承
  7. mybatis无mapper.xml用法
  8. Linux共享内存(二)
  9. 从变分编码、信息瓶颈到正态分布:论遗忘的重要性
  10. 线程打印_面试题:用程序实现两个线程交替打印 0~100 的奇偶数
  11. faster rcnn resnet_RCNN, Fast R-CNN 与 Faster RCNN理解及改进方法
  12. Python 列表 reverse( )方法
  13. spring学习--AOP五个通知
  14. 新事业,新征程:换屏哥,您身边的手机维修专家
  15. PCM 与WAV相互转换代码
  16. HTML5特效(shadow、gradient、transition、transform、filter)
  17. UNIX编程学习——more指令实现
  18. 80386读书笔记之保护虚拟地址存储方式(—)
  19. 面向对象OO的重要概念
  20. SCI英文文献模板/查看SCI论文分区/tex模板的使用

热门文章

  1. 从源码分析DEARGUI之动态特效
  2. windows查看端口占用 windows端口占用 查找端口占用程序 强制结束端口占用 查看某个端口被占用的解决方法 如何查看Windows下端口占用情况...
  3. php中一个经典的!==的用法
  4. zabbix3.2.6.1升级3.4.4图文心得
  5. 《Splunk智能运维实战》——3.11 制作折线图显示项目浏览量和购买量随时间的变化...
  6. php顺序、二分查找
  7. NCBI 下载fna文件 human viral bacteria
  8. numpy比较运算符和其对应的通用函数
  9. 同样的代码,conda无法运行,命令行却可以运行
  10. 训练集(train set) 验证集(validation set) 测试集(test set)