一、冒泡排序

  时间复杂度: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)的更多相关文章

  1. 八大排序方法汇总(选择排序,插入排序-简单插入排序、shell排序,交换排序-冒泡排序、快速排序、堆排序,归并排序,计数排序)

    2013-08-22 14:55:33 八大排序方法汇总(选择排序-简单选择排序.堆排序,插入排序-简单插入排序.shell排序,交换排序-冒泡排序.快速排序,归并排序,计数排序). 插入排序还可以和 ...

  2. 排序算法之冒泡排序Java实现

    排序算法之冒泡排序 舞蹈演示排序: 冒泡排序: http://t.cn/hrf58M 希尔排序:http://t.cn/hrosvb  选择排序:http://t.cn/hros6e  插入排序:ht ...

  3. Java常见排序算法之冒泡排序

    在学习算法的过程中,我们难免会接触很多和排序相关的算法.总而言之,对于任何编程人员来说,基本的排序算法是必须要掌握的. 从今天开始,我们将要进行基本的排序算法的讲解.Are you ready?Let ...

  4. java排序算法之冒泡排序(Bubble Sort)

    java排序算法之冒泡排序(Bubble Sort) 原理:比较两个相邻的元素,将值大的元素交换至右端. 思路:依次比较相邻的两个数,将小数放在前面,大数放在后面.即在第一趟:首先比较第1个和第2个数 ...

  5. 常用的排序算法介绍和在JAVA的实现(二)

    一.写随笔的原因:本文接上次的常用的排序算法介绍和在JAVA的实现(一) 二.具体的内容: 3.交换排序 交换排序:通过交换元素之间的位置来实现排序. 交换排序又可细分为:冒泡排序,快速排序 (1)冒 ...

  6. 【转载】[经验] 嵌入式stm32实用的排序算法 - 交换排序

    Ⅰ.写在前面 前面写了关于ADC采集电压的文章,大家除了求平均的方式来处理采样值,还有没有使用到其他的方式来处理采集值呢? 在某些情况下就需要对一组数据进行排序,并提取头特定的数据出来使用. 排序的应 ...

  7. 常用排序算法(一)-java实现

    排序算法总结 1.十大经典算法及性能 2.具体排序算法 1.冒泡排序 循环过程中比较相邻两个数大小,通过交换正确排位,循环整个数组即可完成排序 图片演示 代码实现Java //冒泡排序 public ...

  8. [ 转载 ] js十大排序算法:冒泡排序

    js十大排序算法:冒泡排序  http://www.cnblogs.com/beli/p/6297741.html

  9. java排序算法之冒泡排序和快速排序

    总结一下Java排序算法,以便记忆. 各类排序的时间复杂度: 排序方法 时间复杂度(平均) 时间复杂度(最坏) 时间复杂度(最好) 空间复杂度 稳定性 复杂性 直接插入排序 O(n2)O(n2) O( ...

  10. java 合并排序算法、冒泡排序算法、选择排序算法、插入排序算法、快速排序算法的描述

    算法是在有限步骤内求解某一问题所使用的一组定义明确的规则.通俗点说,就是计算机解题的过程.在这个过程中,无论是形成解题思路还是编写程序,都是在实施某种算法.前者是推理实现的算法,后者是操作实现的算法. ...

随机推荐

  1. (跨平台)cocos2d-x C++ or Object-C(前端)调用C# webservices(后台),实现交叉编译到Android/IOS/WinPhone等移动终端设备

    1.2014年4月2号算是正式找到自己的实习工作-杭州美迪软件有限公司(移动物联事业部)合作于:四川管家婆总部移动终端代理,由于在校选编程专业语言C#和在浙大网新培训课程(C#.Asp.net开发)缘 ...

  2. 实现php获取mp3文件元信息如播放时间歌曲作者等

    最近收集到一个php获取mp3文件元信息的类,感觉比较方便.现在分享给大家! 下面是使用方式和测试方式: <?php include_once 'mp3file.class.php'; func ...

  3. activiti框架 数据库设计说明

    1.结构设计 1.1.    逻辑结构设计 Activiti使用到的表都是ACT_开头的. ACT_RE_*: ’RE’表示repository(存储),RepositoryService接口所操作的 ...

  4. STRUTS2核心控制器:FilterDispatcher

    1. 在 struts1.x 系列中 , 所有的请求是通过一个 servlet(ActionServlet) 来管理控制的 , 在 Struts2.X 而是经过一个 Filter 来处理请求的. St ...

  5. java设计模式之 工厂模式Factory

    好比某种套路,经过不断实践,证明对项目结构非常有利 如果需要获取某种对象,如同获取不同的产品 需要由工厂来提供,工厂模式 可能的类或者对象:工厂类  产品:Cat  Dog  Fish ... //动 ...

  6. ProcessBuilder 和 Runtime(转)

    ProcessBuilder.start() 和 Runtime.exec() 方法都被用来创建一个操作系统进程(执行命令行操作),并返回 Process 子类的一个实例,该实例可用来控制进程状态并获 ...

  7. poj2583---Series Determination

    #include <stdio.h> #include <stdlib.h> int main() { int x,y,z,a,b,c; while(scanf("% ...

  8. java多线程向数据库写入数据

    任务: 从sqlserver中将一个表A(约16W条数据)导到mysql中对应的一个表B中. 思路:分段获取A表中的数据后,用多个线程同时向B表中写入. 关键代码 //将数据库中的数据条数分段 pub ...

  9. 使用PHP实现请求响应和MySql访问

    在iOS开发当中经常需要使用来自后台的数据,所以使用一种很简便的写后台的方法. 首先,安装XAMPP,这是一个集成好的阿帕奇+MySQL环境,点击按钮即可开启服务,不需要进行任何环境配置. 然后,开启 ...

  10. Effective C++ 条款11

    在operator=中处理"自我赋值" 什么是自我赋值,非常明显. 就是自己的值赋值给了自己.以下的代码就是自我赋值: class Widget { public: Widget& ...