图解Java排序算法之快速排序的三数取中法
作者:dreamcatcher-cx 时间:2022-02-26 17:58:23
基本步骤
三数取中
在快排的过程中,每一次我们要取一个元素作为枢纽值,以这个数字来将序列划分为两部分。在此我们采用三数取中法,也就是取左端、中间、右端三个数,然后进行排序,将中间数作为枢纽值。
根据枢纽值进行分割
代码实现
package sortdemo;
import java.util.Arrays;
/**
* Created by chengxiao on 2016/12/14.
* 快速排序
*/
public class QuickSort {
public static void main(String[] args) {
int[] arr = {9, 8, 7, 6, 5, 4, 3, 2, 1, 0};
quickSort(arr, 0, arr.length - 1);
System.out.println("排序结果:" + Arrays.toString(arr));
}
/**
* @param arr
* @param left 左指针
* @param right 右指针
*/
public static void quickSort(int[] arr, int left, int right) {
if (left < right) {
//获取枢纽值,并将其放在当前待处理序列末尾
dealPivot(arr, left, right);
//枢纽值被放在序列末尾
int pivot = right - 1;
//左指针
int i = left;
//右指针
int j = right - 1;
while (true) {
while (arr[++i] < arr[pivot]) {
}
while (j > left && arr[--j] > arr[pivot]) {
}
if (i < j) {
swap(arr, i, j);
} else {
break;
}
}
if (i < right) {
swap(arr, i, right - 1);
}
quickSort(arr, left, i - 1);
quickSort(arr, i + 1, right);
}
}
/**
* 处理枢纽值
*
* @param arr
* @param left
* @param right
*/
public static void dealPivot(int[] arr, int left, int right) {
int mid = (left + right) / 2;
if (arr[left] > arr[mid]) {
swap(arr, left, mid);
}
if (arr[left] > arr[right]) {
swap(arr, left, right);
}
if (arr[right] < arr[mid]) {
swap(arr, right, mid);
}
swap(arr, right - 1, mid);
}
/**
* 交换元素通用处理
*
* @param arr
* @param a
* @param b
*/
private static void swap(int[] arr, int a, int b) {
int temp = arr[a];
arr[a] = arr[b];
arr[b] = temp;
}
}
排序结果
[1, 2, 3, 4, 5, 6, 7, 8]
来源:https://www.cnblogs.com/chengxiao/p/6262208.html
标签:Java,排序算法,快速排序,三数取中法
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
优化MyBatis配置文件中的配置详解
2023-11-10 14:03:51
![](https://img.aspxhome.com/file/2023/7/59077_0s.png)
Java数组与堆栈相关知识总结
2023-11-12 06:12:18
![](https://img.aspxhome.com/file/2023/7/59337_0s.jpg)
Java基础之final关键字作用案例
2022-11-02 19:23:35
![](https://img.aspxhome.com/file/2023/6/62126_0s.png)
AsyncTask官方文档教程整理
2023-07-31 20:25:08
java通过方向键控制小球移动的小游戏
2023-11-10 05:25:59
通过实例解析JMM和Volatile底层原理
2023-05-20 19:10:48
![](https://img.aspxhome.com/file/2023/1/62201_0s.png)
Java 获取网络302重定向URL的方法
2022-03-25 15:19:46
Java中的Object类详细介绍
2023-11-23 23:18:46
基于spring security实现登录注销功能过程解析
2023-11-29 06:09:05
![](https://img.aspxhome.com/file/2023/8/59378_0s.png)
jstorm源码解析之bolt异常处理方法
2022-08-05 23:12:08
Spring Cloud Gateway(读取、修改 Request Body)的操作
2023-11-09 19:25:46
![](https://img.aspxhome.com/file/2023/0/59240_0s.jpg)
Java实现扑克牌程序
2023-11-11 12:09:52
![](https://img.aspxhome.com/file/2023/0/59340_0s.jpg)
java读取文件字符集示例方法
2023-11-09 12:35:39
基于Tomcat7、Java、WebSocket的服务器推送聊天室实例
2023-11-25 23:35:34
![](https://img.aspxhome.com/file/2023/0/60390_0s.jpg)
Logback日志基础及自定义配置代码实例
2022-09-04 01:01:41
Java Callable接口实现细节详解
2023-11-10 05:34:26
![](https://img.aspxhome.com/file/2023/5/58995_0s.png)
springcloud项目占用内存好几个G导致服务器崩溃的问题
2023-03-30 09:54:25
![](https://img.aspxhome.com/file/2023/6/61236_0s.png)
Java SoftReference类案例详解
2023-04-07 06:52:29
SpringBoot结合JWT登录权限控制的实现
2023-10-06 04:54:22
Zookeeper和Eureka哪个更好?
2023-11-10 02:57:35