java实现快速排序 图解+代码推导

快速排序示意图
在这里插入图片描述快速排序思路分析:
在这里插入图片描述
快速排序完整代码:

import java.util.Arrays;

public class quickSort {
    
    
	public static void main(String[] args) {
    
    
		int[] arr = {
    
     5, 1, 4, 7, 82, 6, 15, 12, 27, 14 };
		quick(arr, 0, arr.length - 1);
		System.out.println("快速排序后=" + Arrays.toString(arr));
	}

	public static void quick(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 += 1;
			}
			// 在pivot的右边一直找,找到小于等于pivot值,才退出
			while (arr[r] > pivot) {
    
    
				r -= 1;
			}
			// 如果l >= r 说明pivot的左右两边的值,已经按照左边全部都是
			// 小于等于pivot值,右边全部是大于等于pivot值
			if (l >= r) {
    
    
				break;
			}
			// 交换
			temp = arr[l];
			arr[l] = arr[r];
			arr[r] = temp;

			// 如果交换完成后,发现这个arr[1] == pivot相等 r- - ,前移
			if (arr[l] == pivot) {
    
    
				r -= 1;
			}
			// 如果交换完成后,发现这个arr[r] == pivot相等 l++,后移
			if (arr[r] == pivot) {
    
    
				l += 1;
			}
		}
		// 如果 l == r,必须1++,r--,否则会出现栈溢出
		if (l == r) {
    
    
			l += 1;
			r -= 1;
		}
		// 向左递归
		if (left < r) {
    
    
			quick(arr, left, r);
		}
		// 向右递归
		if (right > l) {
    
    
			quick(arr, l, r);
		}
	}
}

猜你喜欢

转载自blog.csdn.net/weixin_46457946/article/details/113249539
今日推荐