快排中核心的方法应该算是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 这样,你下一次递归直接就可以避免重复比较相同的基准值了。

Partition函数的更多相关文章

  1. 剑指Offer28 最小的K个数(Partition函数应用+大顶堆)

    包含了Partition函数的多种用法 以及大顶堆操作 /*********************************************************************** ...

  2. 寻找序列中最小的第N个元素(partition函数实现)

    Partition为分割算法,用于将一个序列a[n]分为三部分:a[n]中大于某一元素x的部分,等于x的部分和小于x的部分. Partition程序如下: long Partition (long a ...

  3. 快速排序 partition函数的所有版本比较

    partition函数是快排的核心部分 它的目的就是将数组划分为<=pivot和>pivot两部分,或者是<pivot和>=pivot 其实现方法大体有两种,单向扫描版本和双向 ...

  4. 字符串的partition函数

    partition函数 str1='sdga2a34'aa=str1.partition('a') print(aa) """ ('sdg', 'a', '2a34') ...

  5. 快速排序中的partition函数的枢纽元选择,代码细节,以及其标准实现

    很多笔试面试都喜欢考察快排,叫你手写一个也不是啥事.我很早之前就学了这个,对快速排序的过程是很清楚的.但是最近自己尝试手写,发现之前对算法的细节把握不够精准,很多地方甚至只是大脑中的一个映像,而没有理 ...

  6. find_if函数与partition函数的转换

    编写程序,求大于等于一个给定长度的单词有多少.我们还会修改输出,使程序只打印大于等于给定长度的单词. 使用find_if实现的代码如下: #include<algorithm> #incl ...

  7. Hadoop Partition函数应用(归档)

    一.实例描述 在这个实例里我们使用简单的数据集,里面包含多条数据,每条数据由姓名.年龄.性别和成绩组成.实例要求是按照如下规则归档用户. 1.找出年龄小于20岁中男生和女生的最大分数 2.找出20岁到 ...

  8. 快速排序的Partition函数

    1 //数组中两个数的交换 2 static void swap(int[] nums, int pos1, int pos2){ 3 int temp = nums[pos1]; 4 nums[po ...

  9. mysql5.1,5.5,5.6做partition时支持的函数

    mysql5.1支持的partition函数(http://dev.mysql.com/doc/refman/5.1/en/partitioning-limitations-functions.htm ...

随机推荐

  1. SQL Server 数据库表的管理

    上一篇文章简单梳理了一下SQL Server数据库的安装和基本操作,这篇文章主要讲述一下数据库表的管理 一.数据库的创建 有关数据库的创建有两种方式,一种是通过视图创建,第二种就是通过T-SQL语句来 ...

  2. python基础(9):文件处理

    很多软件都会有有对文件处理的功能.今天我们就来学习文件处理. 文件处理 打开文件时,需要指定文件路径和以何等方式打开文件,打开后,可以将结果赋值给一个变量,这个变量我们称为句柄.这样我们就可以通过这个 ...

  3. Spring Data JPA在Spring Boot中的应用

    1.JPA JPA(Java Persistence API)是Sun官方提出的Java持久化规范.它为Java开发人员提供了一种对象/关联映射工具来管理Java应用中的关系数据.他的出现主要是为了简 ...

  4. (转)mysql水平分表和垂直分表和数据库分区

    坚信数据库的物理设计在对高级数据库的性能影响上远比其他因素重要.给大家说一下经过专家对Oracle的研究,他们解释了为什么拙劣的物理设计是数据库停机(无论是有计划的还是没计划的)背后的主要原因.但在这 ...

  5. 【JAVASCRIPT】React学习-JSX 语法

    摘要 react 学习包括几个部分: 文本渲染 JSX 语法 组件化思想 数据流 JSX 语法 1. 定义 JSX 是javascript + xml 的合集,我们可以将javascript 与 ht ...

  6. reversing.kr easy crack 之write up

    之前学逆向感觉学得一踏糊涂,这阶段好多师傅带我,一定要好好学,重新开始,认真学习. 来看打开可执行文件: 用ollydbg载入,单步执行后停到了入口点: 分析入口点,并没有加壳,于是F9执行程序,跳出 ...

  7. mybatis中的mapper接口文件以及example类的实例函数以及详解

    ##Example example = new ##Example(); example.setOrderByClause("字段名 ASC"); //升序排列,desc为降序排列 ...

  8. Xcode调试时查看变量的方法

    在Debug Console窗口中(lldb)后可以使用两个指令: 1.print 变量名:打印出变量值 2.po 对象名:print object,打印出对象中的值: 另外,Command+Shif ...

  9. ChromeDriver,IEDriver,Firefox配置

    ChromeDriver: 下载ChromeDriver.exe,放入某个文件夹,如C:\Program Files (x86)\Google\Chrome\Application,把此路径加入pat ...

  10. Linux - 简明Shell编程10 - 管道(Pipe)

    脚本地址 https://github.com/anliven/L-Shell/tree/master/Shell-Basics 示例脚本及注释 #!/bin/bash echo '##### Num ...