package com.atguigu.sort;
import com.sun.org.apache.xpath.internal.WhitespaceStrippingElementMatcher;
import java.util.Arrays;
/**
* @创建人 wdl
* @创建时间 2021/3/22
* @描述
*/
public class QuickSort {
public static void main(String[] args) {
//[-9,78,0,23,-567,70]
int[] arr = {-9, 78, 0, 23, -567, 70};
quickSort(arr,0,arr.length-1);
System.out.println("arr="+ Arrays.toString(arr));
}
public static void quickSort(int[] arr, int left, int right) {
int l = left;//左下标
int r = right;//右下标
//pivot中轴
int pivot = arr[(left + right) / 2];
int temp=0;//临时变量,作为交换时使用
//while循环的目的是让比pivot值小的放到左边
//比pivot值大放到右边
while (l < r) {
//在pivot的左边一直找,找到一个大于等于pivot的值,才退出
while (arr[l] < pivot) {
l++;
}
//在pivot的右边一直找,找到一个小于等于pivot的值,才退出
while (arr[r] > pivot) {
r--;
}
//如果l>=r成立说明pivot的左右两的值,已经按照左边全部是小于等于pivot的值,
// 右边全部都是大于等于pivot的值
if(l>=r){
break;
}
//交换
temp=arr[l];
arr[l]=arr[r];
arr[r]=temp;
//如果交换完后,发现这个arr[l]==pivot值相等--,前移
if(arr[l]==pivot){
r--;
}
//如果交换完后,发现这个arr[l]==pivot值相等++,前移
if(arr[r]==pivot){
l++;
}
}
//如果l==r,必须l++,r--,否则会出现栈溢出
if(l==r){
l++;
r--;
}
//向左递归
if(left<r){
quickSort(arr,left,r);
}
//向右递归
if(right>l){
quickSort(arr,l,right);
}
}
}
快速排序+思路分析
原创
©著作权归作者所有:来自51CTO博客作者Frank___7的原创作品,请联系作者获取转载授权,否则将追究法律责任
图解
代码实现
上一篇:快速排序+时间测试(yyds)
下一篇:希尔排序+移位法(吊打交换法)
提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章
-
快速排序的思路和代码
首先快速排序的时间其实不管是算法还是程序,其实解...
时间复杂度 递归 快速排序 -
排序算法之——快速排序分析
引言本篇的主题是快速排序,它可能是应用最广泛的算法了。它的平均运行时间是O(NlogN)O(NlogN)O(NlogN),最坏情形性能为O
图解快速排序 快速排序分析 快速排序Java实现 选择问题 第k小元素 -
数据结构227-快速排序的思路javascript 前端 数据结构
-
浅谈算法——快速排序性能分析
上篇文章介绍了一下基本的冒泡排序,今天介绍一下快速排序。
快速排序 冒泡排序 逆序 子串 时间复杂度 -
算法设计与分析(快速排序
它的核心思想是通过一个称为“枢轴”(pivot)的元素将数组分成两个子数组,使得左子数组中的所有元素都小于枢轴,而右子
算法 排序算法 数据结构 开发语言 c语言