排序---快速排序及其切分函数Partition应用
快速排序
快速排序通过一个切分元素将数组分成两个子数组,左子数组小于等于切分元素,右子数组大于切分元素,将这两个子数组排序,也就是将整个数组排序了。
代码如下:
public class Sort{
public static void quickSort(int []arr){
if(arr=null||arr.length<2)
return;
quickSort(arr,0,arr.length-1);
}
public static void quickSort(int[]arr,int l,int r){
if(l<r){
swap(arr, l + (int) (Math.random() * (r - l + 1)), r); //随机选取切分值,然后交换到数组最后一位
int []p=partition(arr,l,r);//返回于切分值相等的左右界
quickSort(arr,l,p[0]-1);
quickSort(arr,p[1]+1,r);
}
}
public static int[]partition(int[]arr,int l,int r){
int less=l-1; //小于区域的右边界
int more=r; //大于区域的左边界,初始包含最右端元素,即切分值。
while(l<more){
if(arr[l]<arr[r]){ //arr[r]作为切分值
swap(arr,++less,l++); //如果当前元素小于切分值,那么将当前元素和小于区域的右边第一个元素和当前元素交换,小于区域向右扩大一位,访问下一个元素,继续进行比较。
}else if(arr[l]>arr[r]){
swap(arr,--more,l);//如果当前元素大于切分值,那么将当前元素和大于区域的左边第一个元素和当前元素交换,大于区域向左扩大一位,继续访问当前元素,进行比较。
}else{ //和切分值相等
l++;
}
}
swap(arr,more,r); //将切分值换到中间
return new int[]{less+1,more}; //与切分值相等的区间
}
public static void swap(int[]arr,int more,int r){
arr[more]=arr[more]^arr[r];
arr[r]=arr[more]^arr[r];
arr[more]=arr[more]^arr[r];
}
}
快速排序是原地排序,不需要辅助数组,但是递归调用需要辅助栈。快速排序最好的情况下是每次都正好将数组对半分,这样递归调用次数才是最小的。这种情况下比较次数为Cn=2Cn/2+n,复杂度为O(NlogN)。
最坏的情况是,第一次从最大的元素或最小的元素切分,第二次从第二大或者第二小的元素切分,如此这般,最坏情况下的比较次数为N * N /2。为了防止数组一开始就是有序的,我们在选择切分值是,进行随机选取。
切分函数partition的应用,荷兰国旗问题,将数组分成三部分,分别对应于小于,等于,大于 切分元素。时间复杂度为O(n)。
public int[]partition(int []arr,int l,int r){
int less=l-1; //小于区域的右边界
int more=r; //大于区域的左边界,初始包含最右端元素,即切分值。
while(l<more){
if(arr[l]<arr[r]){ //arr[r]作为切分值
swap(arr,++less,l++); //如果当前元素小于切分值,那么将当前元素和小于区域的右边第一个元素和当前元素交换,小于区域向右扩大一位,访问下一个元素,继续进行比较。
}else if(arr[l]>arr[r]){
swap(arr,--more,l);//如果当前元素大于切分值,那么将当前元素和大于区域的左边第一个元素和当前元素交换,大于区域向左扩大一位,继续访问当前元素,进行比较。
}else{ //和切分值相等
l++;
}
}
swap(arr,more,r); //将切分值换到中间
return new int[]{less+1,more}; //与切分值相等的区间
}
排序---快速排序及其切分函数Partition应用的更多相关文章
- 分区函数Partition By的与row_number()的用法以及与排序rank()的用法详解(获取分组(分区)中前几条记录)
partition by关键字是分析性函数的一部分,它和聚合函数不同的地方在于它能返回一个分组中的多条记录,而聚合函数一般只有一条反映统计值的记录,partition by用于给结果集分组,如果没有指 ...
- <算法基础><排序>三种高级排序——快速排序,堆排序,归并排序
这三种排序算法的性能比较如下: 排序名称 时间复杂度(平均) 时间复杂度(最坏) 辅助空间 稳定性 快速排序 O(nlogn) O(n*n) O(nlogn) 不稳定 堆排序 O(nlogn) O(n ...
- JS排序--快速排序
用 JavaScript 实现快速排序代码如下: /* * @author liphong * @data 2019/02/24 */ var arr = []; // 需要被排序数组 /* * 分离 ...
- sqlserver中分区函数 partition by的用法
partition by关键字是分析性函数的一部分,它和聚合函数(如group by)不同的地方在于它能返回一个分组中的多条记录,而聚合函数一般只有一条反映统计值的记录, partition by ...
- sqlserver中分区函数 partition by与 group by 区别 删除关键字段重复列
partition by关键字是分析性函数的一部分,它和聚合函数(如group by)不同的地方在于它能返回一个分组中的多条记录,而聚合函数一般只有一条反映统计值的记录, partition by ...
- js中各个排序算法和sort函数的比较
js中要实现数据排序,其实只需要用sort函数就能很好的满足了,但是我今天想知道他和其他排序算法的区别,比如耗时呀等.测了一组数据如下: // ---------- 一些排序算法 Sort = {} ...
- 常用的PHP函数封装,有排序和数据库操作函数
//二分查找 function bin_sch($array, $low, $high, $k) { if ($low <= $high) { $mid = intval(($low + $hi ...
- 分组函数 partition by 的详解,与order by 区别
partition by关键字是分析性函数的一部分,它和聚合函数(如group by)不同的地方在于它能返回一个分组中的多条记录,而聚合函数一般只有一条反映统计值的记录, partition by ...
- JAVA排序--[快速排序]
package com.array; public class Sort_Quick { /* * 项目名称:快速排序 ; * 项目要求:用JAVA对数组进行排序,并运用快速排序算法; * 作者:Se ...
随机推荐
- ForkJoinPool详解
本文的主要目的是介绍 ForkJoinPool 的适用场景,实现原理,以及示例代码. 说在前面可以说是说明,也可以说下面是结论: ForkJoinPool 不是为了替代 ExecutorService ...
- Spring的AOP和IoC及隔离级别
Spring的AOP和IoC Spring AOP:代理机制.Spring提供的自动代理机制 Spring的IoC来实组件之间的依赖关系注入, 使控制层与业务实现分离,即客户通过调用业务委托接口来调用 ...
- web前后端分离漏洞分析防御
web前后端分离漏洞分析防御 漏洞分析,主要漏洞有 一.跨站脚本攻击XSS 程序 + 数据 = 结果:攻击后,数据夹杂一部分程序(执行代码),导致结果改变: 1.XSS攻击注入点 (a):HTML节点 ...
- centos7标准版命令界面和图形界面相互切换
1.root登陆终端 2.输入命令 vi /etc/inittab ,查看两种界面的启动模式: 3.退出vi模式,,输入命令systemctl get-default 查看当前系统启动模式:我的是命令 ...
- myeclipse web project 名字可以包含中文吗?
1.理论上是可以有中文名的,但是由于中文因为编码的原因导致不可预料的后果,所以一般不建议使用中文名称 2. Myeclipse中修改Web项目名字的方法 方法一:新建项目法(有效的备份原来的项目) ...
- mysql版本
$ mysql Welcome to the MariaDB monitor. Commands end with ; or \g. Your MySQL connection id is 4791 ...
- tensorflow2 keras.Callback logs
官方文档上表示logs内存的内容为 on_epoch_end: logs include `acc` and `loss`, and optionally include `val_loss` (if ...
- CF1037H Security 后缀自动机 + right集合线段树合并 + 贪心
题目描述: 给定一个字符串 $S$ 给出 $Q$ 个操作,给出 $L,R,T$,求出字典序最小的 $S_{1}$ 为 $S[L...R]$的子串,且 $S_{1}$ 的字典序严格大于 $T$. 输出这 ...
- apache如何发布地图服务
svg jpg Tomcat和apache是什么关系呢?:https://www.cnblogs.com/zangdalei/p/8057325.html geoserver又是怎么来的呢? Tomc ...
- spring-cloud zuul网关
API Gateway 是随着微服务(Microservice)这个概念一起兴起的一种架构模式,它用于解决微服务过于分散,没有一个统一的出入口进行流量管理的问题. 使用 Zuul 实现 API Gat ...