1. 双指针写法

1.1. 我一开始使用的,l = start + 1,

力扣上的提交结果:

class QuickSort {public int[] sortArray(int[] nums) {quickSort(nums, 0, nums.length - 1);return nums;}public static void quickSort(int[] nums, int start, int end){if(start >= end) return;int middle = partition(nums, start, end);quickSort(nums, start, middle - 1);quickSort(nums, middle + 1, end);}public static int partition(int[] nums, int start, int end){// 经过大量提交测试,发现当l = start + 1int l = start + 1, r = end, pivot = nums[start];while(l < r){while(l < r && nums[r] > pivot) r--;    while(l < r && nums[l] <= pivot) l++;if(l < r) swap(nums, l++, r--);   //这里给l++和r--能够提高效率,如果都没有// 则必须给18行或者19行把大于或小于改成大于等于或者小于等于(四选一就能保证算法正常运行)}if(l == r && nums[r] > pivot) r--;swap(nums, start, r);return r;}public static void swap(int[] nums, int i, int j) {if(i >= j) return;nums[i] += nums[j];nums[j] = nums[i] - nums[j];nums[i] = nums[i] - nums[j];}
}

存疑的话,可以在力扣上测试
https://leetcode-cn.com/leetbook/read/sort-algorithms/eta44r/

1.2 或者下面这个,l = start,一般写法

class Solution {public int[] sortArray(int[] nums) {quickSort(nums, 0, nums.length - 1);return nums;}public static void quickSort(int[] nums, int start, int end){if(start >= end) return;int middle = partition(nums, start, end);quickSort(nums, start, middle - 1);quickSort(nums, middle + 1, end);}public static int partition(int[] nums, int start, int end){int l = start, r = end, pivot = nums[start];while(l < r){while(l < r && nums[r] >= pivot) r--;while(l < r && nums[l] <= pivot) l++;if(l < r) swap(nums, l, r);}// if(l == r && nums[r] > pivot) r--;swap(nums, start, r);return r;}public static void swap(int[] nums, int i, int j) {if(i >= j) return;nums[i] += nums[j];nums[j] = nums[i] - nums[j];nums[i] = nums[i] - nums[j];}
}

2. 最简单的分区算法

分区思路:从 left 开始,遇到比基数大的数,就交换到数组最后,并将 right 减一,直到 left 和 right 相遇,此时数组就被分成了左右两个区域。再将基数和中间的数交换,返回中间值的下标即可。
力扣上提交结果显示该算法:

class Solution {public int[] sortArray(int[] nums) {quickSort(nums, 0, nums.length - 1);return nums;}public static void quickSort(int[] nums, int start, int end){if(start >= end) return;int middle = partition(nums, start, end);quickSort(nums, start, middle - 1);quickSort(nums, middle + 1, end);}public static int partition(int[] nums, int start, int end){int l = start + 1, r = end, pivot = nums[start];while(l < r){while(l < r && nums[l] <= pivot) l++;if(l != r) swap(nums, l, r--);}if(l == r && nums[r] > pivot) r--;if(start != r) swap(nums, start, r);return r;}public static void swap(int[] nums, int i, int j) {if(i == j) return;nums[i] += nums[j];nums[j] = nums[i] - nums[j];nums[i] = nums[i] - nums[j];}
}

当然,快排还有很多优化后的方法,读者可以自行搜索并实现。抛砖喽!

Java快排两种写法相关推荐

  1. 快排两种实现及五种优化

    快速排序是一个优秀的排序算法,O(n²)和Ω(nlgn),期望运行时间:θ(nlgn)且常数因子较小. 快排运用了分治的思想: 分:将数组划分成两部分(核心,partition) 治:递归地对划分地两 ...

  2. java : enum、创建文件和文件夹、删除文件和文件夹、获得项目绝对路径、写入数据到excel中、java代码中两种路径符号写法、读取、写入text文件...

    java : enum http://www.cnblogs.com/hyl8218/p/5088287.html 创建文件和文件夹.删除文件和文件夹 http://www.cnblogs.com/m ...

  3. 快排三种基本解法以及两种快排优化

    /*  快速排序  基本思想    选定每次排序的基准数据 在剩下的位置将小于基准值的数据放在基准值得左边,大于基准值的数据放到基准值的右边    一次划分之后 如果此基准值的左右两边仍存在大于两个数 ...

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

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

  5. java快排原理_Java数据结构与算法——快速排序

    声明:码字不易,转载请注明出处,欢迎文章下方讨论交流. 前言:Java数据结构与算法专题会不定时更新,欢迎各位读者监督.本篇文章介绍排序算法中最常用也是面试中最容易考到的排序算法--快排,包括快排的思 ...

  6. java快排算法解读,java 快排的思路与算法

    java 快排的思路与算法 有时候面试的时候的会问道Arrays.sort()是怎么实现的,我以前根本不知道是什么东西,最近点进去看了一下.直接吓傻, //看到这个时候还是比较淡定的,可怕的事情来了. ...

  7. java类型转换答案,在java中支持两种类型的类型转换,自动类型转换和强制类型转换。父类转化为子类需要强制转换。...

    在java中支持两种类型的类型转换,自动类型转换和强制类型转换.父类转化为子类需要强制转换. 更多相关问题 计算机病毒通过()传染扩散得极快,危害最大. 当一个现象的数量由小变大,另一个现象的数量相反 ...

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

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

  9. 冒泡排序BubbleSort(两种写法)

    冒泡排序的核心理念是什么?那就是相邻两数比较,前面的数比后面的数小的话,就交换位置,每次循环找到该次排序的最小值,然后放到该次循环数组的队尾,因此便利到最后,留的就是最大的数. 那么在这里说下冒泡排序 ...

  10. 完全理解乘法快速幂及其两种写法的解析

    an=?0≤n≤10105an=?0≤n≤10105 a^n=? \qquad 0 \le n \le 10^{10^5} 没错,乘法快速幂就是解决上述问题的. 乘法快速幂的思想 可以看到,要求一个数 ...

最新文章

  1. 5G前夜 运营商如何实现网络创新?
  2. Android加载大图片(压缩)
  3. 如何添加和删除LaunchPad里面的程序图标
  4. 禁用当前的账户win7_拯救你的win7系统,电脑优化到位,打游戏才会流畅
  5. Shark集群搭建配置
  6. linux下写sql语言,如何写这个sql语句?
  7. RabbitMQ学习二
  8. Linux学习笔记(十五)用户和用户组
  9. 通过小程序给公众号传递消息_多输入现场消息传递应用程序概念
  10. 又被野外利用了!新曝光Office产品多个远程命令执行漏洞分析
  11. 从零开发HarmonyOS(鸿蒙)运动手表小游戏——数字华容道
  12. An工具介绍之形状工具及渐变变形工具
  13. Python_day01-----day07
  14. Android 面经:我是如何进入大厂腾讯的?
  15. 如何删除计算机guest用户,win7如何删掉Guest账户?win7删除Guest账户方法
  16. 20200307 NOI Online T2 冒泡排序(逆序对)
  17. 笔记本建立WIFI热点的bat命令
  18. 一个电子商务网站的设计及开发环境配置文档
  19. c语言中数组f30 a 5,C语言程序设计第7章new.ppt
  20. 半导封装测试流程_江苏半导体封装测试服务

热门文章

  1. android缩放大图片加载
  2. SPSS——描述性统计分析——列联表
  3. java uml类图虚线实线_时序图的实线和虚线-类图中的实线与虚线-用例图中实线箭头表示什么...
  4. Mysql性能优化:什么是索引下推?
  5. android系统电源管理驱动分析
  6. 如何用饼状图显示数据
  7. 顶岗实习周记java方向_java程序员的实习周记
  8. 当series用math包里的log计算出现错误
  9. 二项分布期望和方差的公式推导
  10. pandownload复活版下载 | 百度网盘下载速度慢的终极解决方案