java 鸡尾酒排序_冒泡排序及优化(Java实现)
向大端冒泡
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实现)相关推荐
- java 鸡尾酒排序_算法渣-排序-冒泡
没有一身好内功,招式再多都是空;算法绝对是防身必备,面试时更是不可或缺:跟着算法渣一起从零学算法 定义 冒泡排序(Bubble Sort),是一种计算机科学领域的较简单的排序算法. 这个算法的名字由来 ...
- java每轮排序结果,冒泡排序及其优化java
java冒泡排序及其优化## version1 public static void bubbleSort() { int[] arr={5,6,1,4,3,2,7,8}: for (int i = ...
- Java 八大排序之冒泡排序详解
Java 八大排序之冒泡排序详解 分析冒泡排序 数组[24,69,80,57,13] 第1轮排序:目标把最大数放在最后 第1 次比较:[24,69,80,57,13] 第2 次比较:[24,69,8 ...
- java python算法_用Python,Java和C ++示例解释的排序算法
java python算法 什么是排序算法? (What is a Sorting Algorithm?) Sorting algorithms are a set of instructions t ...
- java 概率 算法_使用概率算法优化快速排序(JAVA)
前言 前面一篇文章系统介绍了快速排序算法,提到快速排序虽然平均时间复杂度为o(n*log2(n)),效率相对比较高.但是其在特殊情况下,比如降序的情况下,效率和冒泡排序一致,这就削弱了快速排序给人的好 ...
- java sorted排序_【算法】排序算法之计数排序
前几回,我们已经对冒泡排序.直接插入排序.希尔排序.选择排序.快速排序.归并排序.堆排序做了说明分析.本回,将对计数排序进行相关说明分析. 一.排序算法系列目录说明 冒泡排序(Bubble Sort) ...
- java实现排序(2)-冒泡排序
引言 也许冒泡排序,一个刚出大学的的程序员可能写的出来,反而工作了几年的老程序员可能会写不出来,你还写的出来么?在本篇博文中,详细介绍了冒泡排序的概念,同时用数组和双向链表来实现,附带一种通俗的优化方 ...
- 冒泡排序及优化(Java实现)
向大端冒泡 public class BubbleSort {public static <T extends Comparable<? super T>> void sort ...
- java comparator 降序排序_【转】java comparator 升序、降序、倒序从源码角度理解
原文链接:https://blog.csdn.net/u013066244/article/details/78997869 环境 jdk:1.7+ 前言 之前我写过关于comparator的理解,但 ...
最新文章
- 对C语言程序进行编译时 针对以下情况,linux书上划的题的答案.doc
- Chapter12:动态内存
- easyui中 在子tabs中 添加新的tabs
- 独家|OpenCV 1.1 Mat - 基本图像容器(附链接)
- 在Ring3上实现文件碎甲(解锁)功能
- Java基础08 继承
- mybatis无mapper.xml用法
- Linux共享内存(二)
- 从变分编码、信息瓶颈到正态分布:论遗忘的重要性
- 线程打印_面试题:用程序实现两个线程交替打印 0~100 的奇偶数
- faster rcnn resnet_RCNN, Fast R-CNN 与 Faster RCNN理解及改进方法
- Python 列表 reverse( )方法
- spring学习--AOP五个通知
- 新事业,新征程:换屏哥,您身边的手机维修专家
- PCM 与WAV相互转换代码
- HTML5特效(shadow、gradient、transition、transform、filter)
- UNIX编程学习——more指令实现
- 80386读书笔记之保护虚拟地址存储方式(—)
- 面向对象OO的重要概念
- SCI英文文献模板/查看SCI论文分区/tex模板的使用
热门文章
- 从源码分析DEARGUI之动态特效
- windows查看端口占用 windows端口占用 查找端口占用程序 强制结束端口占用 查看某个端口被占用的解决方法 如何查看Windows下端口占用情况...
- php中一个经典的!==的用法
- zabbix3.2.6.1升级3.4.4图文心得
- 《Splunk智能运维实战》——3.11 制作折线图显示项目浏览量和购买量随时间的变化...
- php顺序、二分查找
- NCBI 下载fna文件 human viral bacteria
- numpy比较运算符和其对应的通用函数
- 同样的代码,conda无法运行,命令行却可以运行
- 训练集(train set) 验证集(validation set) 测试集(test set)