第一种,左右填坑法:这种方法很经典,首先抽取枢纽元素,然后设置两个指针分别从左右两端开始,将小于枢纽元素的填补到数组左端空缺位置,大于枢纽元素的填补到数组右端空缺位置,每次填补之后换成另一端开始遍历。

public static void quicksort(int[] array,int left,int right){if(left>=right) return;Random ra=new Random();int i=ra.nextInt(right-left)+left,j=right;int[] swap=swap(array[i],array[left]);array[i]=swap[0];array[left]=swap[1];int coreElem=array[left];i=left;while(i<j){while(array[j]>coreElem&&i<j){j--;}if(i<j) {array[i]=array[j];i++;}        while(array[i]<coreElem&&i<j){i++;}if(i<j){array[j]=array[i];j--;}}array[i]=coreElem;quicksort(array,left,i-1);quicksort(array,i+1,right);
}

第二种,前后交换法:一种比较巧妙的实现方法,首先将枢纽元素放在最右端,设置两个指针从最左端出发,一先一后。一旦走在前面的firstPointer发现了比枢纽元素小的元素,就将该元素“抛到”secondPointer指向的下一个位置。最终形成left~secondPointer的元素都比枢纽小,而secondPointer~firstPointer的元素都大于或者等于枢纽元素。

public static int partition(int[] array,int left,int right){int firstPointer=left,secondPointer=left-1;Random ra=new Random();int i=ra.nextInt(right-left)+left;int[] swap=swap(array[i],array[right]);array[i]=swap[0];array[right]=swap[1];while(firstPointer<right){if(array[firstPointer]<array[right]){secondPointer++;if(firstPointer!=secondPointer)swap=swap(array[firstPointer],array[secondPointer]);array[firstPointer]=swap[0];array[secondPointer]=swap[1];}firstPointer++;}array[++secondPointer]=array[right];return secondPointer;
}public static void quicksort(int[] array,int left,int right){if(left>=right) return;int partitionIndex=partition(array,left,right);if(partitionIndex>left) quicksort(array,left,partitionIndex-1);if(partitionIndex<right) quicksort(array,partitionIndex+1,right);
}

另附swap,java中比较简易的swap函数实现:

public static int[] swap(int a,int b){return new int[]{b,a};}

快速排序的两种写法:左右填坑法与前后交换法相关推荐

  1. vue-cli3.0引入高德地图3d效果两种方法+实例+填坑

    前言: 因为项目需要引入高德地图的3d效果,找了很多资料,在这里记录下方法和实例组件 ***注意: 因为两个方法代码量都特别大,这里分2个页面详细说一下,方法一是链接出去专门说,最下面有更多资料,高德 ...

  2. python装饰器带参数函数_python带参数装饰器的两种写法

    python带参数装饰器的两种写法 前言 最近在实现一个装饰器的过程中发现了一个很有意思的地方,在博客里面分享出来 不同的写法 三层函数嵌套,实现了可传参数的一个装饰器. import logging ...

  3. 快速排序的两种实现方法(c语言版本)

    经过调研发现,对任意无序整数数组,快速排序有两种实现方法,这里简单阐述下思路: 思路一:随意选择一个基准元,一般选择数组的起始元或末尾元,Weiss这本书上特意搞了个算法来选择基准元,--,总之就是基 ...

  4. 两种写法的效果一样,那么到底哪一种更好呢?

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 有时候,我们在写一些循环逻辑的时候,并不是按执行次数等作 ...

  5. Model层的两种写法

    Model层的两种写法 第一种写法 namespace MyMVC.Models {public class Child{ //属性private int id;public int Id{get { ...

  6. controller 有两种写法,讨论一下两种写法的区别:

    controller 有两种写法,讨论一下两种写法的区别: 写法 1: app.controller('myCtrl', function($scope, $location) { $scope.my ...

  7. Sql语句中 case when .. 的两种写法

    在 SQL查询语句中, case 语句的两种写法(SqlServer 2005 下测试通过): 1. select (case 字段1  when a then 0  when b then 1  e ...

  8. 20210408:力扣(二分查找法的两种写法以及变体题目)

    二分查找法的两种写法以及变体题目 写在前面 题目 思路与算法 代码实现 写在最后 写在前面 关于二分查找,真的是一个非常实用的查找算法,主要有两种写法,今天在总结时再次碰到,再次整理,方便后续查看复习 ...

  9. sum 去重_总结leetcode上【排列问题】【组合问题】【子集问题】回溯算法去重的两种写法!...

    本周小结!(回溯算法系列三)续集 在 本周小结!(回溯算法系列三) 中一位录友对 整颗树的本层和同一节点的本层有疑问,也让我重新思考了一下,发现这里确实有问题,所以专门写一篇来纠正,感谢录友们的积极交 ...

  10. Vue2基础-el与data的两种写法(HTML版)

    目录 一.el的2种写法 二.data的2种写法 三. 一个重要的原则 Vue2基础全套教程合集:点击跳转        Vue2高级全套教程合集:点击跳转 一.el的2种写法 new Vue时候配置 ...

最新文章

  1. 4 Git 基础 - 撤消操作
  2. 41 岁的黄峥辞任拼多多董事长一职,未来将投身于科学研究!
  3. django写项目的详细步骤
  4. 微软提出AdaLM,用于开发小型、快速且有效的领域预训练语言模型
  5. Apollo快速使用
  6. leetcode 3. Longest Substring Without Repeating Characters | 3. 无重复字符的最长子串(双指针+滑窗)
  7. mysql5717开发设置怎么调回来_华为手机这几个默认设置,一定要关闭,再也不卡顿...
  8. 2013.11.18—2013.11.22周总结
  9. 转:[C/C++]2014年7月华为校招机试真题(一)
  10. 第六计 / Explosive City (2004)
  11. java深入学习2多线程(面试必备)
  12. winform与数据库同步更新
  13. 埃森哲物联网报告:制造业向智能服务转型的新引擎
  14. Bootstrap3基础 栅格系统 标尺(col-lg/md/sm/xs-1)
  15. matlab如何设置数值类型,matlab数据类型(数值类型)
  16. 数字信号处理(一)时域采样定理
  17. 计算机电源的正确连接顺序是什么意思,先插电脑还是先插电源?插入顺序你知道吗?...
  18. Delta3D(6)教程:创建游戏角色-2
  19. 计算机技能鉴定高级,职业技能鉴定计算机(高级)试题.pdf
  20. java自定义类加载器并观察类卸载过程

热门文章

  1. 网页保存视频最有效的几种方法
  2. ArcBlock 赴美国华盛顿州议会作证支持区块链立法
  3. 【毕业设计】单片机 火灾智能报警系统 - 嵌入式 物联网
  4. 搭档之家:14天1.5万人民币!悉尼将征收入境隔离费
  5. Cocos Creator 国旗头像生成器,源码奉上!
  6. 从零建造一个基于深度强化学习的期货日内高频交易模型(一)下载数据
  7. 使用Swiss-Prot根据同源基因进行注释
  8. 研究生做实验时被炸伤致残!法院判决:驳回高校上诉,赔偿162万!
  9. UART0串口编程系列之前奏篇
  10. 这里excel将文本转换为数字