快排中核心的方法应该算是Partition函数了,它的作用就是将整个数组分成小于基准值的左边,和大于基准值的右边。

普通的Partition函数是这样的:

public static int partition1(int[] array,int lo,int hi){//以第一个值为基准值,当然你也可以3取1,int key=array[lo];while(lo<hi){while(array[hi]>key&&hi>lo){//从后半部分向前扫描hi--;}array[lo]=array[hi];while(array[lo]<=key&&hi>lo){//从前半部分向后扫描lo++;}array[hi]=array[lo];}array[hi]=key;return hi;}public static void main(String[] args) {int[] a = {34,2,25,1,12,34,12,56,23,15,34,67,89,54,34};partition2(a, 0, 14);for(int i=0; i<a.length; i++) {System.err.print(a[i]+" ");}}
打印的结果是:
34 2 25 1 12 34 12 34 23 15 **34** 67 89 54 56 看出来没,大家都是相同的基准值34是各自分开的,我们希望得结果应该是这样的:
25 1 12 12 23 15 34 34 34 34 89 54 67 56
这样的好处是相同的值,在后续的遍历过程中,不用再比较一次了。

(左程云,左神写的)
牛逼的Partition函数是这样的:

public static int[] partition1(int[] arr, int begin, int end, int pivotValue) {int small = begin - 1;int cur = begin;int big = end + 1;while (cur != big) {if (arr[cur] < pivotValue) {swap(arr, ++small, cur++);} else if (arr[cur] > pivotValue) {swap(arr, cur, --big);} else {cur++;}}int[] range = new int[2];range[0] = small + 1;range[1] = big - 1;return range;}public static void main(String[] args) {int[] a = {34,2,25,1,12,34,12,56,23,15,34,67,89,54,34};int[] b = partition1(a,0,14,34);System.out.println(b[0]);System.out.println(b[1]);for(int i=0; i<a.length; i++) {System.err.print(a[i]+" ");}}
输出的结果是:
7 //相同基准值的起始索引
10 //相同基准值的末尾索引
2 25 1 12 12 23 15 **34 34 34 34** 89 54 67 56 这样,你下一次递归直接就可以避免重复比较相同的基准值了。

转载于:https://www.cnblogs.com/loren-Yang/p/7466115.html

Partition函数相关推荐

  1. Scala的partition函数

    对集合进行分组 你是否尝试过将一个集合按一定的规则拆分成两个新的集合?比如,我们把某个集合拆分成偶数集和奇数集,partition 函数可以帮我们做到这一点: val numbers = Seq(3, ...

  2. Partition函数实现java(含分析)

    Partition函数作用 在数组中选择一个数字,接下来把数组中的数字分为两部分,比选择的数字小的数字移到数组的左边,比选择的数字大的数字移到到数组的右边. Partition还可以用来实现长度为n的 ...

  3. 快排的两种partition函数

    partition函数就是快排的关键部分,作用是将数组划分成两部分,左边小于基数,右边大于基数 但实际上它也不仅仅用于快排,在求top(K)问题中也常常会用到. 下面介绍两种partition函数,他 ...

  4. python partition函数_Python partition()函数的使用方法

    Python中 partition() 函数的作用是在首次出现分隔字符串的位置把字符串分割为三部分,并以元组的形式返回分割结果,返回的元组中包括分隔字符串之前的部分,分隔字符串本身及分隔字符串之后的部 ...

  5. 快排中的Partition函数

    快排的递归形式 快排算法的程序结构: def quicksort(nums, l, r):if l >= r:returnk = partition(nums, l, r)quicksort(n ...

  6. 《剑指offer》Partition函数及其Partition函数周边

      Partion函数最早出现于快速排序算法,但其代表的分治思想,在<剑指offer>这本书中求数组中位数(面试题39,数组中出现次数超过一半的数字)中也有所涉及,将其汇总在一起,称之为P ...

  7. python partition函数_如何使用正确的姿势进行高效Python函数式编程?

    演讲者:丁来强@Splunk  PyConChina2015 北京站 9月12日与9月19日,PyConChina 2015上海站与北京站顺利落下帷幕."人生苦短,Python 当歌&quo ...

  8. python partition函数_在Python中相当于R的createDataPartition

    在scikit learn中,您将获得工具train_test_splitfrom sklearn.cross_validation import train_test_split from skle ...

  9. python3 分割函数 partition rpartition 函数

    partition 函数,其实这个函数跟split差不多,都是字符串切割的. 举个例子: >>> a = 'changzhi1990'>>> a.rpartitio ...

最新文章

  1. python零基础难学吗-如何从零开始学习Python,零基础学python难吗
  2. 数据库事务的四大特性ACID
  3. //输入学生人数,挨个输入姓名,身高,年龄,求平均年龄,然后按身高降序排列输出...
  4. cocos2d-x项目101次相遇-安装和环境搭建 -xcode
  5. Visual Studio 2010 实用功能总结
  6. pythonsocket中tcp通信接收不到数据_通信中数据发生错误,接收方如何判决?检错码与纠错码必不可少...
  7. java 人脸识别 demo_基于虹软sdk,java实现人脸识别(demo)
  8. 树莓派安装raspbian并配置开发环境
  9. 全球与中国电子探针市场现状及未来发展趋势2022-2028
  10. Linux虚拟网络基础 — Bridge
  11. 银行业务--负债业务
  12. 特殊时期下捣鼓树莓派4
  13. CentOS7里ping命令详解
  14. 业务开发平台与SOA的统一论
  15. Altium Designer快捷键和规则
  16. 华为鲲鹏HCIA考试-练习05
  17. composer之创建自己的包
  18. TCP/IP协议详解篇一(基础)
  19. word中使页眉不同的同时,页码相同 的问题解决
  20. 求n的阶乘,求1~n的阶乘和(循环)

热门文章

  1. 深入理解JVM之二:垃圾收集器概述
  2. IOS 面试 --- 动画 block
  3. SWT中调用Automation的方式
  4. centos 查看mysql 服务器配置_在CentOS上MySQL数据库服务器配置方法
  5. Error: Command failed: xcrun instruments -s
  6. 设置Kali Linux虚拟机连接网络
  7. BeagleBone Black教程之BeagleBone Black设备的连接
  8. HealthKit开发教程之HealthKit的辅助数据
  9. python字符型_python字符类型
  10. python中常用的序列化模块_Python常用模块之pickle——对象序列化