java 鸡尾酒排序_算法渣-排序-冒泡
没有一身好内功,招式再多都是空;算法绝对是防身必备,面试时更是不可或缺;跟着算法渣一起从零学算法
定义
冒泡排序(Bubble Sort),是一种计算机科学领域的较简单的排序算法。
这个算法的名字由来是因为越大的元素会经由交换慢慢“浮”到数列的顶端(升序或降序排列),就如同碳酸饮料中二氧化碳的气泡最终会上浮到顶端一样,故名“冒泡排序”
算法
它重复地走访过要排序的元素列,依次比较两个相邻的元素,如果他们的顺序(如从大到小、首字母从A到Z)错误就把他们交换过来。走访元素的工作是重复地进行直到没有相邻元素需要交换,也就是说该元素已经排序完成。
演示
对数组[5,6,3,1,8,7,2,4]进行冒泡排序
/**
* 传统写法
* @param sorts
*/
private static void bubbleSort(int [] sorts){
for (int i=0;i
for (int j= 0;j
if(sorts[j]
swap(sorts,j,j+1);
}
}
}
}
private static void swap(int []sorts,int i,int j){
int tmp = sorts[i];
sorts[i] = sorts[j];
sorts[j] = tmp;
}
改进
有序
如果一个数组本身就是有序的,或者部分已经有序
比如:[8,7,6,5,4,3,1,2]
假如现在有一个长度10000的数组,前1000无序,后9000有序并且大于前1000数据。用上面这种方法,数据交换次数在1000之内,但是剩下9000的数据虽然没有交换,但是每次循环都会进行比较。剩下9000数据已经有序了,我们不要对它们去进行判断浪费不必要的时间/**
* 如果部分已经排序,设置一个flag,有序就跳出循环
* @param sorts
*/
private static void bubbleSort1(int [] sorts){
for (int i=0;i
boolean flag = false;
for (int j= 0;j
if(sorts[j]
swap(sorts,j,j+1);
flag = true;
}
}
if(!flag) {
break;
}
}
}
鸡尾酒排序
鸡尾酒排序等于是冒泡排序的轻微变形。不同的地方在于从低到高然后从高到低,而冒泡排序则仅从低到高去比较序列里的每个元素。他可以得到比冒泡排序稍微好一点的效能,原因是冒泡排序只从一个方向进行比对(由低到高),每次循环只移动一个项目。
算法
/**
* 鸡尾酒排序,定向冒泡排序
* @param sorts
*/
private static void bubbleSort2(int [] sorts){
int i = 0;
int j = sorts.length-1;
while (i <= j) {
for(int s = i;s
if(sorts[s]
swap(sorts, s, s + 1);
}
}
System.out.println(JSON.toJSONString(sorts));
for(int e = j;e>i;e--) {//从右往左
if(sorts[e] > sorts[e-1]) {
swap(sorts, e, e - 1);
}
}
j--;i++;
System.out.println(JSON.toJSONString(sorts));
}
}
总体上,鸡尾酒排序可以获得比冒泡排序稍好的性能。但是完全逆序时,鸡尾酒排序与冒泡排序的效率都非常差
时间复杂度如果我们的数据正序,只需要走一趟即可完成排序。所需的比较次数C和记录移动次数M均达到最小值,即:Cmin=n-1;Mmin=0;所以,冒泡排序最好的时间复杂度为O(n)。
如果很不幸我们的数据是反序的,则需要进行n-1趟排序。每趟排序要进行n-i次比较(1≤i≤n-1),且每次比较都必须移动记录三次来达到交换记录位置。在这种情况下,比较和移动次数均达到最大值:
BestAverageWorstMemoryStablenn^2n^21Stable
java 鸡尾酒排序_算法渣-排序-冒泡相关推荐
- java 英文字符串排序_英文字符串排序算法
编程工作偶尔会遇到一些不常见问题需要处理,学编程处理问题也难免需要熟悉一些算法 以前学习的时候就遇到过一个看似简单的排序算法问题,当时的解决办法是我没有用过的,在此记录一下'' 问题 - 英文字符串排 ...
- java 桶排序_[图解] 桶排序
桶排序是一种排序的思想,其实现包括计数排序和基数排序两种,冒泡排序.选择排序.插入排序.归并排序.快速排序和堆排序都是基于比较的排序,而桶排序提出了一种新的思路,即基于数据状态的排序. 1. 桶排序的 ...
- java字符串排序_对字符串排序持一种宽容的心态
在Java中一涉及中文处理就会冒出很多问题来,其中排序也是一个让人头疼的课题,我们来看下面的代码: 上面的代码定义一个数组,然后进行升序排序,我们期望的结果是按照拼音升序排列,即为李四.王五.张三,但 ...
- c++ sort 从大到小排序_算法的艺术:MySQL order by对各种排序算法的巧用
在 [精华]洞悉MySQL底层架构:游走在缓冲与磁盘之间 这篇文章中,我们介绍了索引树的页面怎么加载到内存中,如何淘汰,等底层细节.这篇文章我们从比较宏观的角度来看MySQL中关键字的原理.本文,我们 ...
- shell sort 最后一列排序_算法实现系列(1)—— 排序算法
1.冒泡排序(Bubble Sort) 冒泡排序是一种简单的排序算法.它重复地遍历过要排序的数列,每次比较两个元素,如果它们的顺序不符合预期,就把它们的位置交换过来.遍历数列的工作是重复地进行直到没有 ...
- Java指令屏障_指令重排序和内存屏障
sap hana计算技术项目实战指南内存 61元 (需用券) 去购买 > 一.指令重排序 指令重排序分为三种,分别为编译器优化重排序.指令级并行重排序.内存系统重排序.如图所示,后面两种为处理器 ...
- arraylist java 排序_「arraylist排序」java ArrayList的两种排序方法 - seo实验室
arraylist排序 1.ArrayList使用排序的初衷 我们知道ArrayList的好处是可以不用限定容器的大小,他会根据元素的增加自己扩大.但是存储进去的数据类型都会变成object,虽然每个 ...
- 希尔排序python 简书_数据结构_排序_直接插入+希尔排序
数据结构_排序_直接插入排序+希尔排序 其实主要是为了讲述希尔排序,不过插入排序是希尔排序的基础,因此先来讲直接插入排序. 一.直接插入排序 1.原理 下标 0 1 2 3 4 5 6 7 8 -- ...
- shell按照时间排序_【经典排序】希尔排序
希尔排序 简介: 希尔排序,英文Shell's sort,是一位叫D.L.Shell的老哥在1959就提出来的算法,是<插入排序>的一种又称"缩小增量排序"(Dimin ...
最新文章
- win7下安装docker
- asp.net中获取当前url的方法
- c++备忘录模式mememto
- Tomcat启动阻塞变慢
- LeetCode 1971. Find if Path Exists in Graph(图的遍历)
- 基于APMSSGA-LSTM的容器云资源预测
- windows2008R2+IIS部署python Django的web环境
- java高并发日志_高并发下log4j的性能瓶颈
- Can not find the tag library descriptor for “http://java.sun.com/jsp/jstl/core“
- linux 增加虚拟设备,第一篇Zstack之创建虚拟机
- 滚动率分析(Roll Rate Analysis)
- 探索生产计划排程(APS)的发展历程
- 南开计算机考研难么,我的一点考研心得
- 基于混沌的一般彩色图像加密算法的Matlab实现
- 智课雅思词汇---二十六、形容词后缀-ble
- ipa 修改服务器地址,iOS重签名 – ipa包(服务器适用)
- 机器学习及SparkMLlib简介
- 卧槽!百度网盘宣布 VIP 开放免费领取!亲测有效!!
- 二级联动 三级联动 多级联动 无限级联动下拉列表或菜单专题
- MS17-010(永恒之蓝)适合Windows 2008r2的补丁如何打?