排序算法——交换排序(冒泡排序、快速排序)(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 合并排序算法、冒泡排序算法、选择排序算法、插入排序算法、快速排序算法的描述
算法是在有限步骤内求解某一问题所使用的一组定义明确的规则.通俗点说,就是计算机解题的过程.在这个过程中,无论是形成解题思路还是编写程序,都是在实施某种算法.前者是推理实现的算法,后者是操作实现的算法. ...
随机推荐
- .net通用权限框架B/S (五)--WEB(3)组织机构
.net通用权限框架B/S 首先我们看导航菜单中,对组织机构的设置 我们设置了组织机构名称,链接(对应的mvc控制器名/orga),图标是个小钥匙,菜单的操作权限设置的是"添加,编辑,删除& ...
- SQLSERVER分布式事务使用实例
实例一 尊重原著作:本文参考自http://www.jb51.net/article/43540.htm --BEGIN DISTRIBUTED TRANSACTION [transactionnam ...
- Oracle EBS DBA常用SQL - 安装/补丁【Z】
Oracle EBS DBA常用SQL - 安装/补丁 检查应用补丁有没有安装:select bug_number,last_update_date from ad_bugs where bug_nu ...
- Memcached管理
安装memcached服务端: apt-get install memcached 配置文件存在于: /etc/memcached.conf 启动memcache: memcached -d -m - ...
- NSIndexPath的初始化方法
好几次用到了NSIndexPath,但是一直不知道怎么通过 row section这两个参数来初始化 NSIndexPath *index = [NSIndexPath indexPathForR ...
- oracle ORA-00913: 值过多
--oracle中查看表是否被锁 查看表是否被锁 SELECT /*+ rule*/ a.sid, b.owner, object_name, object_type FROM v$loc ...
- poj2459 Treasure Exploration (闭包+二分)
这道题是让求派出机器人的最少数量,乍一看以为是简单的求最小路径覆盖,后来发现错了,因为有的点可以走多次,而二分中每个点只能走一次,所以要先用floyd进行传递闭包,然后用二分 #include< ...
- 高效CSS开发核心要点摘录
做网站的,我们都知道尽量减少请求数,压缩CSS代码量,使用高效CSS选择符等方式可以来提高网站的载入速度和访问速度,也就是优化网站的性能. 下面分析了一些CSS的书写方式,很多都是我们知道并且正在使用 ...
- Android Material Design调色板
转: http://www.stormzhang.com/design/2014/12/26/material-design-palette/ Material Design出来一段时间了,身为And ...
- codeforces 659C . Tanya and Toys 二分
题目链接 将给出的已经有了的排序, 在前面加上0, 后面加上1e9+1. 然后对相邻的两项判断. 如果相邻两项之间的数的和小于m, 那么全都选上, m减去相应的值. 如果大于m, 那么二分判断最多能选 ...