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);
}
- 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 数组属性和方法
- Android 给控件添加边框阴影效果
- 详解Android Selinux 权限及问题
- Android图片采样缩放功能实例代码
- Android开发中使用Intent打开第三方应用及验证可用性的方法详解
- Android 7.0开发获取存储设备信息的方法
- Android中默认系统的声音/大小修改和配置详解
- Android开发中计算器的sin、cos及tan值计算问题分析
- Android开发实现绘制淘宝收益图折线效果示例
- Android自定义View实现搜索框(SearchView)功能
- android 监听SD卡文件变化的实现代码
- Android监听手机短信的示例代码
- Android开发之图片压缩工具类完整实例
- Android6.0开发中屏幕旋转原理与流程分析
- Android中WebView的基本配置与填坑记录大全
- Android开发实现ListView异步加载数据的方法详解