快排
2019-08-30 18:28
1921 查看
先讲经典快排。
数组最后一个值是 X (划分值)
争取<= X 的值放在左边,>= X 的放在右边。
开始一个数组,最后一个值作为划分值。
然后整个数组分为两个部分,<=X 的在左边,>=X 的在右边。
然后<=X 的当做一个全新的数组,再次把最后一个值当做划分值。两个部分拆分下去,让整个部分都有序。以上是经典快排。
改进:
=x 的部分不动,小于X 的区域和大于 X 的区域继续这样的过程——递归。
package suanfa; public class quickSort { 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); //经过一个p过程,返回一个数组,是等于区域的左右两个边界 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; // less 是小于区域的 int more = R; // more是 大于区域的 while (L < more) { //循环条件,只要左边界<右边界,循环下去 if (arr[L] < 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 i, int j) { int tmp = arr[i]; arr[i] = arr[j]; arr[j] = tmp; } public static void main(String[] args) { int[] arr = { 0, 1, -94, 65, 888 }; System.out.println(java.util.Arrays.toString(arr)); quicksort(arr); System.out.println(java.util.Arrays.toString(arr)); } }
相关文章推荐
- 马蜂窝视频编辑框架设计及在 iOS 端的业务实践
- 获取豆瓣电影数据(R与API获取网页数据)
- HashMap源码分析
- 安全便捷的SSH密钥对配置及管理工具
- vue笔记
- 非域环境下SQL Server搭建Mirror(镜像)的详细步骤
- 快速去水印的工具有什么
- 奇舞周刊第 319 期:Figma 插件系统的架构设计
- 安全便捷的SSH密钥对配置及管理工具
- 农业银行:银行业中台系统的建设思路 - 更多
- 学生信息管理系统总结(优化二)
- Leetcode 96.不同的搜索二叉树
- springboot项目使用redis实现唯一登录
- cocoscreator打包android的各种问题
- UE4蓝图与C++交互——射击游戏中多武器系统的实现
- Java电商秒杀系统性能优化(七)——交易优化技术之事务型消息-保证最终一致性
- SaaS设计:自动化服务启停设计示例
- linux mint 安装
- java 泛型 类型作为参量 Class transform
- TKRapidMask for mac(ps分区曝光调整插件/TKActions) v2.0中文激