快速排序

  快速排序通过一个切分元素将数组分成两个子数组,左子数组小于等于切分元素,右子数组大于切分元素,将这两个子数组排序,也就是将整个数组排序了。

代码如下:

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应用的更多相关文章

  1. 分区函数Partition By的与row_number()的用法以及与排序rank()的用法详解(获取分组(分区)中前几条记录)

    partition by关键字是分析性函数的一部分,它和聚合函数不同的地方在于它能返回一个分组中的多条记录,而聚合函数一般只有一条反映统计值的记录,partition by用于给结果集分组,如果没有指 ...

  2. <算法基础><排序>三种高级排序——快速排序,堆排序,归并排序

    这三种排序算法的性能比较如下: 排序名称 时间复杂度(平均) 时间复杂度(最坏) 辅助空间 稳定性 快速排序 O(nlogn) O(n*n) O(nlogn) 不稳定 堆排序 O(nlogn) O(n ...

  3. JS排序--快速排序

    用 JavaScript 实现快速排序代码如下: /* * @author liphong * @data 2019/02/24 */ var arr = []; // 需要被排序数组 /* * 分离 ...

  4. sqlserver中分区函数 partition by的用法

    partition  by关键字是分析性函数的一部分,它和聚合函数(如group by)不同的地方在于它能返回一个分组中的多条记录,而聚合函数一般只有一条反映统计值的记录, partition  by ...

  5. sqlserver中分区函数 partition by与 group by 区别 删除关键字段重复列

    partition  by关键字是分析性函数的一部分,它和聚合函数(如group by)不同的地方在于它能返回一个分组中的多条记录,而聚合函数一般只有一条反映统计值的记录, partition  by ...

  6. js中各个排序算法和sort函数的比较

    js中要实现数据排序,其实只需要用sort函数就能很好的满足了,但是我今天想知道他和其他排序算法的区别,比如耗时呀等.测了一组数据如下: // ---------- 一些排序算法 Sort = {} ...

  7. 常用的PHP函数封装,有排序和数据库操作函数

    //二分查找 function bin_sch($array, $low, $high, $k) { if ($low <= $high) { $mid = intval(($low + $hi ...

  8. 分组函数 partition by 的详解,与order by 区别

    partition  by关键字是分析性函数的一部分,它和聚合函数(如group by)不同的地方在于它能返回一个分组中的多条记录,而聚合函数一般只有一条反映统计值的记录, partition  by ...

  9. JAVA排序--[快速排序]

    package com.array; public class Sort_Quick { /* * 项目名称:快速排序 ; * 项目要求:用JAVA对数组进行排序,并运用快速排序算法; * 作者:Se ...

随机推荐

  1. 记一次在mac上源码编译curl,使其支持NSS的过程

    一.背景 在一次学习https原理的过程中,希望客户端指定特定的cipher suites来抓包分析SSL/TLS的握手过程,就想到了使用curl工具,而不是使用浏览器. 接下来使用man curl找 ...

  2. python基础内置函数

    #取绝对值 #print(abs(-1)) #对序列中的元素进行bool运算,如果可迭代对象为空也返回True # print(all((1,23,))) # print(all({"nam ...

  3. 02tensorflow非线性回归以及分类的简单实用,softmax介绍

    import tensorflow as tf import numpy as np import matplotlib.pyplot as plt # 使用numpy生成200个随机点 x_data ...

  4. eclipse没有Web项目和Server选项

    (1)在Eclipse中菜单help选项中选择install new software选项 (2)在work with 栏中输入 http://download.eclipse.org/release ...

  5. ltp-ddt 加入sram 需要修改的部分

    ./platform/fmxx-psoc-db add sram 将nor部分移植过来 # @name NOR read write test using dd # @desc Perform NOR ...

  6. mysql 乐观锁、悲观锁、共享锁,排它锁

    mysql锁机制分为表级锁和行级锁,本文就和大家分享一下我对mysql中行级锁中的共享锁与排他锁进行分享交流. 共享锁又称为读锁,简称S锁,顾名思义,共享锁就是多个事务对于同一数据可以共享一把锁,都能 ...

  7. bzoj4940 [Ynoi2016]这是我自己的发明 莫队+dfs序

    题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=4940 题解 对于换根操作,处理方法就很套路了. 首先先假定以 \(1\) 为根做一遍 dfs, ...

  8. 关于scikit-learn

    机器学习scikit-learn scikit-learn官网学习资料非常丰富,完全可以自学: http://scikit-learn.org/ 目前就以scikit-learn为主要工具学习mach ...

  9. hdu 4717: The Moving Points 【三分】

    题目链接 第一次写三分 三分的基本模板 int SanFen(int l,int r) //找凸点 { ) { //mid为中点,midmid为四等分点 ; ; if( f(mid) > f(m ...

  10. php array_slice()函数 语法

    php array_slice()函数 语法 作用:在数组中根据条件取出一段值,并返回.大理石平台支架 语法:array_slice(array,start,length,preserve) 参数: ...