java数据结构与算法-快速排序
时间:2022-07-26
本文章向大家介绍java数据结构与算法-快速排序,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
基本思想
快速排序使用分治法策略来把一个序列分为两个子序列,基本步骤为:
- 先从序列中取出一个数作为基准数(为了方便一般选数组的第一个数作为基准数)。
- 分区过程:将把这个数大的数全部放到它的右边,小于它的数全放到它的左边。
- 递归的对左右两个子序列进行步骤2,知道各区间只有一个数。
java代码实现
public void sort(int[] arr, int left, int right){
if(left >= right){
return;
}
//左边哨兵开始索引
int i = left;
//右边哨兵开始索引
int j = right;
//基准数
int tmp = arr[left];
//只要还满足左侧索引小于右侧索引,就不停的从右侧找比基准数小的,从左侧找比基准数大的,然后交换
//通过交换可以将比基准数大的放到基准数右边,将比基准数小的放到基准数左边
while(i < j){
//先从右边开始找,找到一个比基准数小的停止
while(tmp <= arr[j] && i < j){
j--;
}
//再从左边开始找,找到一个比基准数大的停止
while(tmp >= arr[i] && i < j){
i++;
}
//将左右找到的两个数进行交换
if(i < j){
int m = arr[j];
arr[j] = arr[i];
arr[i] = m;
}
}
//当左侧哨兵和右侧哨兵的索引相等时(既 i=j),结束循环,将基准数与当前位置上的数进行交换
//为啥当 i 和 j 相遇时要将当前位置和基准数交换呢?
//如果是 j 走向 i 导致的相遇,那说明在上一轮 i 这个位子是比基准数大的,通过和 j 交换,
//这时 i 的位子上的数变成了以前 j 位置上的数,因此比基准数小,所以要交换。
//如果是因为 i 走向 j 导致相遇,那说明在这一轮中右侧找到了比基准数小的(就是 j 位置上的数),
//而左侧没找到比基准数大的,此时 i 和 j 位置一样,所以当前位置上的数比基准数小,因此交换。
arr[left] = arr[i];
arr[i] = tmp;
//对左右子集进行递归调用
sort(arr,left,j -1);
sort(arr,j + 1,right);
}
- WPF备忘录(3)如何从 Datagrid 中获得单元格的内容与 使用值转换器进行绑定数据的转换IValueConverter
- WPF备忘录(2)WPF获取和设置鼠标位置与progressbar的使用方法
- WPF文字修饰——上、中、下划线与基线
- 微信公众平台数据接口正式对所有认证公众号开放
- 参考基因组没有,经费也没那么多,怎么办?
- .Net下SQLite的DBHelp
- 数据库进程间通信解决方案之MQ
- 【学术】算法交易的神经网络:强化经典策略
- java.util.logging 例子
- WPF命令(Command)介绍、命令和数据绑定集成应用
- lncRNA实战项目-第六步-WGCNA相关性分析
- 【项目】Github上的一个简单项目:用人工智能预测大学录取概率
- lncRNA实战项目-第五步-差异表达的mRNA和lncRNA
- WPF--模板选择
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 解决JPA懒加载典型的N+1问题-注解@NamedEntityGraph
- 基于Shiro,JWT实现微信小程序登录完整例子
- Spring Cloud Eureka 总结
- Spring Cloud Feign 总结
- 掘金15W沸点简单分析(一)
- SpringBoot整合Shiro实现基于角色的权限访问控制(RBAC)系统简单设计从零搭建
- 基于AOP和ThreadLocal实现日志记录
- 搭建prometheus+grafana监控SpringBoot应用入门
- 掘金15W沸点简单分析(二)
- 老生常谈SpringAop日志收集与处理做的工具包
- 线程间通信wait---notify
- Ubuntu安装Oracle Java8
- CentOS7安装Git
- RocketMQ-环境搭建(单master模式-ubuntu版)
- 使用Web.xml配置SpringMvc(同时使用xml配置文件)