Java中快速排序的实现】的更多相关文章

快速排序是对冒泡排序的一种改进.它的基本思想是:通过一躺排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要 小,然后再按次方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列.最坏情况的时间复杂度为O(n^2),最好 情况时间复杂度为O(nlogn). 假设要排序的数组是A[1]……A[N],首先任意选取一个数据(通常选用第一个数据)作为关键数据,然后将所有比它的数都放到它前面,所有比它大的数都放到它后面,这个过程称为一躺…
所谓的快速排序的思想就是,首先把数组的第一个数拿出来做为一个key,在前后分别设置一个i,j做为标识,然后拿这个key对这个数组从后面往前遍历,及j--,直到找到第一个小于这个key的那个数,然后交换这两个值,交换完成后,我们拿着这个key要从i往后遍历了,及i++;一直循环到i=j结束,当这里结束后,我们会发现大于这个key的值都会跑到这个key的后面,不是的话就可能你写错了,小于这个key的就会跑到这个值的前面:然后我们对这个分段的数组再时行递归调用就可以完成整个数组的排序. 用图形法表示由…
近几天再重新看数据结构的书时,根据各种排序的空间复杂度,发现快速排序所用时间是最短的,也即是说快速排序的速度最快.因此想验证一下具体这几个排序发的快慢,所以在Java中得以实现,同时在运行时,发现虽然快速排序的速度很快,但是它所消耗的内存是最大的.这也说明了当我们追求速度时,也必须要付出其他方面的代价.以下是几种方法的具体实现,及其所消耗的时间. 首先在Java中随机生成20个1000以内的数,然后使用四种排序法分别进行排序,验证四种排序程序的无误,以下是具体结果: 通过以上结果证明四种排序方法…
Java中的经典算法之快速排序(Quick Sort) 快速排序的思想 基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小, 然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列. 假定数组A:46 30 82 90 56 17 95 15,取第一个数46位基数,l=0(l是字母,不是数字1)指向第一个数,h=7指向最后一个数: 从右向左找出第一个小于46的数:先比较A[0]和A[7]: 4…
Java中的排序算法(2) * 快速排序 * 快速排序使用分治法(Divide and conquer)策略来把一个序列(list)分为两个子序列(sub-lists). * 步骤为: * 1. 从数列中挑出一个元素,称为 "基准"(pivot), * 2. 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边).在这个分割之后,该基准是它的最后位置.这个称为分割(partition)操作. * 3. 递归地(recursive)把…
Java中的数组排序,一般是利用Arrays.sort(),这个方法是经过优化的快速排序.在Arrays种有多中形式的重载,在这里就不一一列举了. 数组排序的种类: 1.非降序排序, 非升序排序(就排序后数组元素排列的结果而言) 2.基本类型数据的排序,类类型数据的排序(就排序的对象而言) 排序示例: int型数组的非降序排序: package sort; import java.util.Arrays; public class Main { public static void displa…
oj链接:http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=1196 Java中,Arrays.sort()静态方法就是利用的快速排序,(看到网上有的说用的归并排序,测试了下,跟自己写的快速排序消耗的时间和空间都一样,所以确定是快速排序),对类的集合排序,需要实现Comparable接口,(类似C++ STL中sort函数需要的小于号).初学Java集合,记录一下.初学者..下面是调用Arrays.sor…
JAVA中在运用数组进行排序功能时,一般有四种方法:快速排序法.冒泡法.选择排序法.插入排序法. 快速排序法主要是运用了Arrays中的一个方法Arrays.sort()实现. 冒泡法是运用遍历数组进行比较,通过不断的比较将最小值或者最大值一个一个的遍历出来. 选择排序法是将数组的第一个数据作为最大或者最小的值,然后通过比较循环,输出有序的数组. 插入排序是选择一个数组中的数据,通过不断的插入比较最后进行排序. <1>利用Arrays带有的排序方法快速排序 Arrays.sort(a1); i…
什么是数组?顾名思义,就是数据的组合,把一些相同类型的数放到一组里去. 那为什么要用数组呢?比如需要统计全班同学的成绩的时候,如果给班上50个同学的成绩信息都命名一个变量进行存储,显然不方便,而且在做成绩统计,如求总分,平均分,方差等的时候,遍历成绩信息又成了一大难题,这个时候,你就需要用到数组了. 数组可以很好的解决这两个问题,数组名只有一个,只需要使用数组名加下标来访问各个元素的信息即可,遍历的时候,由于下标是连续的,所以访问起来十分方便. 接下来,就开始正式介绍一下数组吧. 数组是用于存储…
本博主要介绍Java中几种常见的排序算法: /* 排序方法的演示1)插入排序(直接插入排序.希尔排序)2)交换排序(冒泡排序.快速排序)3)选择排序(直接选择排序.堆排序)4)归并排序5)分配排序(基数排序)所需辅助空间最多:归并排序所需辅助空间最少:堆排序平均速度最快:快速排序不稳定:快速排序,希尔排序,堆排序.*/ 其中,文字部分来自于网上整理,代码部分属于自己实现的(堆排序,归并排序,基数排序代码来自网上),主要用于自己学习,有空的时候翻翻老笔记看看 -------------------…
List 在 java 中是个有序序列: 一.容量 ArrayList 中有一个容量概念,表示基础数组的大小(无参时默认为 10).在需要的时候(比如 add操作)会自动增加其容量.LinkedList 没有这个概念. TreeMap 也有容量,默认是 16. 二.改善的 search 方法 LinkedList 与 ArrayList 都很低效O(N).比如 Collection 的 contain 和 remove 方法而言.他们均花费线性时间.下面对存.取.查找这三类情况进行比较: 访问数…
首先,Java中自已是有排序的 说明:(1)Arrays类中的sort()使用的是“经过调优的快速排序法”;(2)比如int[],double[],char[]等基数据类型的数组,Arrays类之只是提供了默认的升序排列,没有提供相应的降序排列方法.(3)要对基础类型的数组进行降序排序,需要将这些数组转化为对应的封装类数组,如Integer[],Double[],Character[]等,对这些类数组进行排序.(其实还不如先进行升序排序,自己在转为将序). import java.util.Ar…
整理一下常用的又基础的算法.由于平时的项目比较简单,很少用到算法,但工作不只是眼前的苟且,还有诗和远方. 1.链表 链表用来存储数据,由一系列的结点组成.这些结点的物理地址不一定是连续的,即可能连续,也可能不连续,但链表里的结点是有序的.一个结点由数据的值和下一个数据的地址组成.一个链表内的数据类型可以是多种多样的.数组也是用来存储数据的,与链表相比,需要初始化时确定长度.一个数组内的数据都是同一类型.在Java中,ArrayList是通过数组实现,而LinkedList则通过链表实现.一个简单…
JAVA中在运用数组进行排序功能时,一般有四种方法:快速排序法.冒泡法.选择排序法.插入排序法.快速排序法主要是运用了Arrays中的一个方法Arrays.sort()实现.冒泡法是运用遍历数组进行比较,通过不断的比较将最小值或者最大值一个一个的遍历出来.选择排序法是将数组的第一个数据作为最大或者最小的值,然后通过比较循环,输出有序的数组.插入排序是选择一个数组中的数据,通过不断的插入比较最后进行排序.下面我就将他们的实现方法一一详解供大家参考.<1>利用Arrays带有的排序方法快速排序 i…
java中sort方法的自定义比较器写法 摘要 在做一些算法题时常常会需要对数组.自定义对象.集合进行排序. 在java中对数组排序提供了Arrays.sort()方法,对集合排序提供Collections.sort()方法.对自定义对象排序时要自己重写比较器,对象数组则调用Arrays.sort(),对象集合则调用Collections.sort().两个方法默认都是升序,也可以重写比较器,实现降序. 对数组排序 sort函数模板, 以int型数组arr为例: Arrays.sort(arr,…
java中有哪些锁 这个问题在我看了一遍<java并发编程>后尽然无法回答,说明自己对于锁的概念了解的不够.于是再次翻看了一下书里的内容,突然有点打开脑门的感觉.看来确实是要学习的最好方式是要带着问题去学,并且解决问题. 在java中锁主要两类:内部锁synchronized和显示锁java.util.concurrent.locks.Lock.但细细想这貌似总结的也不太对.应该是由java内置的锁和concurrent实现的一系列锁. 为什么这说,因为在java中一切都是对象,而java对每…
字符串为什么这么重要 写了多年java的开发应该对String不陌生,但是我却越发觉得它陌生.每学一门编程语言就会与字符串这个关键词打不少交道.看来它真的很重要. 字符串就是一系列的字符组合的串,如果写过C/C++的应该就了解,在字符串的操作上会有许多操作的函数与类,用于简化代码的开发.一方面是因为字符串在代码中会频繁用到,另一方面是因为字符串的操作非常麻烦. 最初我知道String的特殊待遇就是在delphi中,因为String在delphi里是一个关键字存在,与其他的基本类型是不一样的.那时…
                               Java中的Socket的用法 Java中的Socket分为普通的Socket和NioSocket. 普通Socket的用法 Java中的网络通信时通过Socket实现的,Socket分为ServerSocket和Socket两大类,ServerSocket用于服务器端,可以通过accept方法监听请求,监听请求后返回Socket,Socket用于完成具体数据传输,客户端也可以使用Socket发起请求并传输数据.ServerSocke…
Action/Service/DAO简介: Action是管理业务(Service)调度和管理跳转的. Service是管理具体的功能的. Action只负责管理,而Service负责实施. DAO只完成增删改查,虽然可以1-n,n-n,1-1关联,模糊.动态.子查询都可以.但是无论多么复杂的查询,dao只是封装增删改查.至于增删查改如何去实现一个功能,dao是不管的. 总结这三者,通过例子来解释: Action像是服务员,顾客点什么菜,菜上给几号桌,都是ta的职责: Service是厨师,ac…
一.Map 名值对存储的. 常用派生类HashMap类 添加: put(key,value)往集合里添加数据 删除: clear()删除所有 remove(key)清除单个,根据k来找 获取: size()获取元素的数量 get(key)根据key获取该数据 containsKey(key)根据key查找集合中有没有该内容,有返回true ,没有返回false containsValue(value)根据value查找集合中有没有改内容,有返回true,没有返回false public stat…
java中有三种移位运算符 <<      :     左移运算符,num << 1,相当于num乘以2 >>      :     右移运算符,num >> 1,相当于num除以2 >>>    :     无符号右移,忽略符号位,空位都以0补齐 下面来看看这些移位运算都是怎样使用的 /** 2 * 3 */ package com.b510.test; /** 7 * @author Jone Hongten 8 * @create d…
一.进程:是程序的一次动态执行,它对应着从代码加载,执行至执行完毕的一个完整的过程,是一个动态的实体,它有自己的生命 周期.它因创建而产生,因调度而运行,因等待资源或事件而被处于等待状态,因完成任务而被撤消.反映了一个程序在 一定的数据 集上运行的全部动态过程.通过进程控制块(PCB)唯一的标识某个进程.同时进程占据着相应的资源(例如包 括cpu的使用 ,轮转时间以及一些其它设备的权限).是系统进行资源分配和调度的一个独立单位. 程序和进程之间的主要区别在于: 状态         是否具有资源…
 Java中的进程与线程 一:进程与线程 概述:几乎任何的操作系统都支持运行多个任务,通常一个任务就是一个程序,而一个程序就是一个进程.当一个进程运行时,内部可能包括多个顺序执行流,每个顺序执行流就是一个线程. 进程:进程是指处于运行过程中的程序,并且具有一定的独立功能.进程是系统进行资源分配和调度的一个单位.当程序进入内存运行时,即为进程. 进程的三个特点: 1:独立性:进程是系统中独立存在的实体,它可以独立拥有资源,每一个进程都有自己独立的地址空间,没有进程本身的运行,用户进程不可以直接访问…
详细文档: Java中的进程与线程.rar 474KB 1/7/2017 6:21:15 PM 概述: 几乎任何的操作系统都支持运行多个任务,通常一个任务就是一个程序,而一个程序就是一个进程.当一个进程运行时,内部可能包括多个顺序执行流,每个顺序执行流就是一个线程. 进程与线程: 进程是指处于运行过程中的程序,并且具有一定的独立功能.进程是系统进行资源分配和调度的一个单位.当程序进入内存运行时,即为线程. 进程拥有以下三个特点: 1:独立性:进程是系统中独立存在的实体,它可以独立拥有资源,每一个…
一般this在各类语言中都表示“调用当前函数的对象”,java中也存在这种用法: public class Leaf { int i = 0; Leaf increment(){ i++; return this; //this指代调用increment()函数的对象 } void print(){ System.out.println("i = " + i); } public static void main(String[] args) { Leaf x = new Leaf()…
        很长时间以来一直代码中用的比较多的数据列表主要是List,而且都是ArrayList,感觉有这个玩意就够了.ArrayList是用于实现动态数组的包装工具类,这样写代码的时候就可以拉进拉出,迭代遍历,蛮方便的.           也不知道从什么时候开始慢慢的代码中就经常会出现HashMap和HashSet之类的工具类.应该说HashMap比较多一些,而且还是面试经典题,平时也会多看看.开始用的时候简单理解就是个键值对应表,使用键来找数据比较方便.随后深入了解后发现这玩意还有点小…
在使用Java编写应用的时候,我们常常需要通过第三方类库来帮助我们完成所需要的功能.有时候这些类库所提供的很多API都通过throws声明了它们所可能抛出的异常.但是在查看这些API的文档时,我们却没有办法找到有关这些异常的详尽解释.在这种情况下,我们不能简单地忽略这些由throws所声明的异常: public void shouldNotThrowCheckedException() { // 该API调用可能抛出一个不明原因的Checked Exception exceptionalAPI(…
关于java中六个时间类的使用和区别 java.util.Date java.sql.Date  java.sql.Time  java.sql.Timestamp java.text.SimpleDateFormat java.util.Calendar java.util.Date日期格式为:年月日时分秒 java.sql.Date日期格式为:年月日java.sql.Time日期格式为:时分秒 java.sql.Timestamp日期格式为:年月日时分秒纳秒(毫微秒) 从数据库中取出来的日期…
Arrays 类是 Java 中提供的一个工具类,在 java.util 包中.该类中包含了一些方法用来直接操作数组,比如可直接实现数组的排序.搜索等(关于类和方法的相关内容在后面的章节中会详细讲解滴~~). Arrays 中常用的方法: 1. 排序 语法:  Arrays.sort(数组名); 可以使用 sort( ) 方法实现对数组的排序,只要将数组名放在 sort( ) 方法的括号中,就可以完成对该数组的排序(按升序排列),如: 运行结果: 2. 将数组转换为字符串 语法:  Arrays…
总结的很粗糙,以后时间富裕了好好修改一下. 1:Java语言定义了许多类专门负责各种方式的输入或者输出,这些类都被放在java.io包中.其中, 所有输入流类都是抽象类InputStream(字节输入流),或者抽象类Reader(字符输入流)的子类: 而所有输出流都是抽象类OutputStream(字节输出流)或者Writer(字符输出流)的子类. [首先需要明白的是:流是干什么的???(为了永久性的保存数据)   根据数据流向的不同分为输入流和输出流:   根据处理数据类型的不同分为字符流和字…