干完工作的时候突然想起来快速排序我一直没学,就去看了一下别人写的博客,用的就是二分查找的思想,而且感觉挺像插入排序的。
插入排序是寻找最大,小值,而快排是确定一个数的左右区域。
package com.qx;import java.util.Arrays;/*** @program: springBoot* @author: quxiao* @create: 2023-12-13 11:03**/
public class t1 {public static void main(String[] args) {int[] ints = {9, 1, 5, 2, 7, 4, 123, 4, 2, 3, 6, 7, 8, 4, 2, 34, 23, 1113, 432, 11, 2, 3, 9};}private static void fastSort(int[] arr) {//确定快排的思想(用升序作为例子)//1、在需要排序的数中,选择一个 t 作为参照,我们要达到的效果是,t的左边小于他,t的右边大于它。这样就算排序好一个数。//2、需要用一个双指针,【 l下标对应的数(arr[l])和t判断,约定小于或等于t 】,【r下标对应的数(arr[r])和t判断,约定大于或等于t】//3、一旦l(arr[l])或者r(arr[r])不满足,对应的移动就停止//4、参照数的归位,首先得确认查找数是应该在哪里,如果取的是arr[l],那就和l交换,如果取的是arr[r]那就和r交换。dfs(arr, 0, arr.length - 1);System.out.println(Arrays.toString(arr));}/*** @param arr 待排序数组* @param l 开始* @param r 结束*/private static void dfs(int[] arr, int l, int r) {if (l > r) {return;}int tl, tr, t;t = arr[l];//之所以要存起来最初的开始、结束位置。是为了确定下一次的开始,结束位置。tl = l;tr = r;while (l < r) {while (arr[r] >= t && l < r) {r--;}while (arr[l] <= t && l < r) {l++;}if (l < r) {int p = arr[r];arr[r] = arr[l];arr[l] = p;}}arr[tl] = arr[l];arr[l] = t;//参照数的左边dfs(arr, tl, l - 1);//参照数的右边dfs(arr, l + 1, tr);}}