排序算法——交换排序(冒泡排序、快速排序)(java)
一、冒泡排序
时间复杂度:O(n^2)
公认最慢的排序,每次把最大/最小的放一边,原理:
[57,68,59,52]
[57,68,59,52]
[57,59,68,52]
[57,59,52,68]
每次比较把相对大的数往后移,最后放到最后一位的就是整个数组中最大的数了,然后对n-1个数继续排序。
public class BubbleSort {
public static <T extends Comparable> void sort(T[] src){
T tmp;
int len = src.length;
for(int i=0;i<len-1;i++){ // 注意是小于len-1,即遍历到倒数第二个元素
for(int j=0;j<len-1-i;j++){
if(src[j].compareTo(src[j+1])>0){
tmp = src[j];
src[j] = src[j+1];
src[j+1] = tmp;
}
}
}
}
}
二、快速排序
时间复杂度:O(nlogn) 最坏情况:O(n^2)
空间复杂度:O(nlogn)
不稳定。
原理:选定基准值,把比它大的放右边,比它小的放左边,这样就分成了两块,对这两块重复以上步骤。
实际操作:
[15,11,18,13,19,17,12,16,14] 移动high指针,low=0,high=8,pivot=15[位置0],第一次对比,14比基准值15小,src[low=0] = src[high8]
[14,11,18,13,19,17,12,16,14] 移动low指针,low依次=0,1,2,high=8,14和11都比15大,18比15大,src[high=8] = src[low=2]
[14,11,18,13,19,17,12,16,18] 移动high指针,low=2,high依次=8,7,6,到12比15小,src[low=2] = src[high=6]
[14,11,12,13,19,17,12,16,18] 移动low指针,low依次=2,3,4,high=6,19比15大,src[high=6] = src[low=4]
[14,11,12,13,19,17,19,16,18] 移动high指针,low=4,high依次=6,5,4,19和17都不小于15,到high=4,!low<high,此时的low/high就是基准值位置
[14,11,12,13,19,17,19,16,18] 现在low=4,high=4,low/high[4] = pivot,19位置值等于基准值
[14,11,12,13],,[17,19,16,18] 分成两块了,再对这两块重复以上步骤,直到分出的值不多于一个。
public class QuickSort {
public static void sort(int[] src){
quickSort(src,0,src.length-1);
}
private static void quickSort(int[] src,int low,int high){
if(low<high){
int mid = partition(src,low,high); // 获得中间值的位置
quickSort(src,low,mid-1); // 对左部分快排
quickSort(src,mid+1,high); // 对右部分快排
}
}
private static int partition(int[] src,int low,int high){
int tmp = src[low]; // 记录基准值
while(low<high){ // 相等时,说明剩一个值,这就是基准值的最终位置
while(low<high&&src[high]>=tmp){
high--; // 从high开始,至有一个比基准值小的值时,high指针不动,下面的while从low开始找
}
src[low] = src[high]; // 交换值
while(low<high&&src[low]<=tmp){
low++;
}
src[high] = src[low];
}
src[low] = tmp;
return low;
}
}
-2014年04月28日--------------------更新了BubbleSort的代码
排序算法——交换排序(冒泡排序、快速排序)(java)的更多相关文章
- 八大排序方法汇总(选择排序,插入排序-简单插入排序、shell排序,交换排序-冒泡排序、快速排序、堆排序,归并排序,计数排序)
2013-08-22 14:55:33 八大排序方法汇总(选择排序-简单选择排序.堆排序,插入排序-简单插入排序.shell排序,交换排序-冒泡排序.快速排序,归并排序,计数排序). 插入排序还可以和 ...
- 排序算法之冒泡排序Java实现
排序算法之冒泡排序 舞蹈演示排序: 冒泡排序: http://t.cn/hrf58M 希尔排序:http://t.cn/hrosvb 选择排序:http://t.cn/hros6e 插入排序:ht ...
- Java常见排序算法之冒泡排序
在学习算法的过程中,我们难免会接触很多和排序相关的算法.总而言之,对于任何编程人员来说,基本的排序算法是必须要掌握的. 从今天开始,我们将要进行基本的排序算法的讲解.Are you ready?Let ...
- java排序算法之冒泡排序(Bubble Sort)
java排序算法之冒泡排序(Bubble Sort) 原理:比较两个相邻的元素,将值大的元素交换至右端. 思路:依次比较相邻的两个数,将小数放在前面,大数放在后面.即在第一趟:首先比较第1个和第2个数 ...
- 常用的排序算法介绍和在JAVA的实现(二)
一.写随笔的原因:本文接上次的常用的排序算法介绍和在JAVA的实现(一) 二.具体的内容: 3.交换排序 交换排序:通过交换元素之间的位置来实现排序. 交换排序又可细分为:冒泡排序,快速排序 (1)冒 ...
- 【转载】[经验] 嵌入式stm32实用的排序算法 - 交换排序
Ⅰ.写在前面 前面写了关于ADC采集电压的文章,大家除了求平均的方式来处理采样值,还有没有使用到其他的方式来处理采集值呢? 在某些情况下就需要对一组数据进行排序,并提取头特定的数据出来使用. 排序的应 ...
- 常用排序算法(一)-java实现
排序算法总结 1.十大经典算法及性能 2.具体排序算法 1.冒泡排序 循环过程中比较相邻两个数大小,通过交换正确排位,循环整个数组即可完成排序 图片演示 代码实现Java //冒泡排序 public ...
- [ 转载 ] js十大排序算法:冒泡排序
js十大排序算法:冒泡排序 http://www.cnblogs.com/beli/p/6297741.html
- java排序算法之冒泡排序和快速排序
总结一下Java排序算法,以便记忆. 各类排序的时间复杂度: 排序方法 时间复杂度(平均) 时间复杂度(最坏) 时间复杂度(最好) 空间复杂度 稳定性 复杂性 直接插入排序 O(n2)O(n2) O( ...
- java 合并排序算法、冒泡排序算法、选择排序算法、插入排序算法、快速排序算法的描述
算法是在有限步骤内求解某一问题所使用的一组定义明确的规则.通俗点说,就是计算机解题的过程.在这个过程中,无论是形成解题思路还是编写程序,都是在实施某种算法.前者是推理实现的算法,后者是操作实现的算法. ...
随机推荐
- 集合与lamdba
List<, , , , }; List<)); /* foreach (int k in iList2) { Console.WriteLine(k.ToString()); } * * ...
- javascript高级知识分析——作为对象的函数
代码信息来自于http://ejohn.org/apps/learn/. 函数和对象是不是非常相似? var obj = {}; var fn = function(){}; console.log( ...
- 对浏览器css兼容性的学习理解及问题解决汇总
一.从浏览器内核的角度 来看,浏览器兼容性问题可分为以下三类: 1. 渲染相关:和样式相关的问题,即体现在布局效果上的问题. 2. 脚本相关:和脚本相关的问题,包括JavaScript和DOM.BOM ...
- Adroid: getExternalStorageDirectory 不一定是你想要的外部存储SdCard
前情提要:我的测试机是华为荣耀6,我装过一个16G的内存卡 因为要面试的需要,我的一个演示项目用的是android本地的WebService.然而写好的webService部署到本地上,应用怎么获取数 ...
- MySQL报错:ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password:NO)
1.关闭mysql # service mysqld stop2.屏蔽权限 # mysqld_safe --skip-grant-table 屏幕出现: Starting demo fro ...
- oracle中查找执行效率低下的SQL
v$sqltext:存储的是完整的SQL,SQL被分割 v$sqlarea:存储的SQL 和一些相关的信息,比如累计的执行次数,逻辑读,物理读等统计信息(统计) v$sql:内存共享SQL区域中已经解 ...
- UIPasteboard 粘贴板
UIPasteboard *pasteboard = pasteboard.string = self.label.text;
- jboss清楚缓存
在服务器上部署或更新时,常常会忘记删除JBOSS的缓存.忘记删除缓存的后果,经常就是改好了代码却还是原来的错误,然后查找半天,浪费时间.所以在重新部署JBOSS,在启动JBOSS前一定要删除JBOSS ...
- LeakCanary,检测安卓,java内存泄漏
官方中文API地址:http://www.liaohuqiu.net/cn/posts/leak-canary-read-me/
- 3D模型选中显示样式改变
osg::ref_ptr<osg::Material> material = new osg::Material(); //模型材质信息 material->setTranspare ...