首页 > 其他分享 >快速排序 (Quick Sort)

快速排序 (Quick Sort)

时间:2024-03-23 19:33:53浏览次数:18  
标签:Sort arr right 基准值 int Quick 排序 left

public static void main(String[] args) {
    int[] arr = {9, 5, 7, 3, 1, 6, 8, 4, 2};
    quickSort(arr,0,arr.length - 1);
}

private static void quickSort(int[] arr, int left, int right) {
    if (left >= right) {
        return;
    }
    //先排序一遍,再递归拆分,和归并有区别,归并是先拆分,再合并排序
    int partition = partition(arr, left, right);//排序完找到前一趟基准值下标,作为左右数组的左右边界
    System.out.println(Arrays.toString(arr));
    quickSort(arr,left,partition - 1);//基准位置已经排序,不用向归并一样参加排序
    quickSort(arr,partition + 1,right);//基准位置已经排序,不用向归并一样参加排序


}

private static int partition(int[] arr, int left, int right) {
    //数组的第一个元素作为基准值
    int pivot = arr[left];
    int i = left;
    int j = right;
    int temp = 0;
    while (i < j) {
        //从右边开始找,找到小于基准值的数
        //跳出循环说明要么找到小于基准值的,要么就是j和i重了
        while (i<j && arr[j] >= pivot) {
            j--;
        }
        //从左边开始找,找到大于基准值的数
        //跳出循环说明要么找到小于基准值的,要么就是j和i重了
        while (i < j && arr[i] <= pivot) {
            i++;
        }
        //找到就开始替换,替换完毕开始下一轮找,直至拆分的数组左右都替换完成
        if (i < j) {
            temp = arr[j];
            arr[j] = arr[i];
            arr[i] = temp;
        }
    }
    //此时基准值还没动,所以把基准值放到指定位置
    temp = arr[i];//这里的i和j是重合的,所以用i和j都可以
    arr[i] = arr[left];//这里为什么是替换left下标,因为上面的循环中,我们是从小到大的顺序排序,i的位置一定是小于基准值的
    arr[left] = temp;
    return i;
}

标签:Sort,arr,right,基准值,int,Quick,排序,left
From: https://www.cnblogs.com/Houqz/p/18091571

相关文章

  • 希尔排序(Shell Sort)
    publicstaticvoidmain(String[]args){int[]arr={9,6,8,4,2,5,7,3,1};int[]arr2={9,6,8,4,2,5,7,3,1};shellSort(arr);System.out.println("=====================");shellSort2(arr2);}/***shell排序,插入排序......
  • java数据结构与算法基础-----排序------堆排序
    java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完):https://blog.csdn.net/grd_java/article/details/123063846文章目录堆排序是利用堆(数据结构)设计的排序算法,属于选择排序,最坏,最好,平均时间复杂度均为O(nlogn),不稳......
  • 排序合集模板
    #include<bits/stdc++.h>usingnamespacestd;constintN=1005;inta[N];intt[N];intn;voidbubbleSort(inta[],intn){//冒泡排序://时间复杂度:O(n^2)//是否稳定:是 for(inti=n;i>1;i--){ for(intj=1;j<i;j++){ if(a[j]>a[j+1]){......
  • 【LeetCode-153.寻找旋转排序数组的最小值】
    已知一个长度为 n 的数组,预先按照升序排列,经由 1 到 n 次 旋转 后,得到输入数组。例如,原数组 nums=[0,1,2,4,5,6,7] 在变化后可能得到:若旋转 4 次,则可以得到 [4,5,6,7,0,1,2]若旋转 7 次,则可以得到 [0,1,2,4,5,6,7]注意,数组 [a[0],a[1],a[2],...,a[n-1......
  • 快速排序的原理及其多种方法的实现和优化
    ✨✨✨学习的道路很枯燥,希望我们能并肩走下来!文章目录前言一、快速排序介绍二、快速排序实现的方法(升序)1.hoare版本:2.挖坑法3.前后指针法  三、快速排序的优化1.关于所排序的数据有序或接近有序的问题1.1随机取key方法1.2三数取中法2.关于递归深度过深导......
  • 十大经典排序之计数排序
    文章目录概要整体架构流程代码实现小结概要计数排序的核心在于将输入的数据值转化为键存储在额外开辟的数组空间中。作为一种线性时间复杂度的排序,计数排序要求输入的数据必须是有确定范围的整数。整体架构流程(1)找出待排序的数组中最大和最小的元素(2)统计数组中每......
  • Java - 冒泡排序
      //冒泡排序publicclassBubbleSort{ publicstaticvoidmain(String[]args){ //定义一个整型的数组 int[]array={64,34,25,12,22,11,90} bubbleSort(array); for(inti:array){ System.out.println(i+""); } } publicstaticvoidbubbl......
  • SpringBoot3.x与SpringDoc OpenApi之Swagger接口排序
    直接使用Swagger之后,发现所有的Controller接口菜单都是无序的先看一下效果 就是利用了一下SpringDoc提供的接口做了一下自定义排序1.在Controller上加上注解@Tag(name="MenuController",description="1-菜单管理")这里需要注意description属性,在下面的代码里......
  • leetcode148. 排序链表-归并法
    148.排序链表题干给你链表的头结点head,请将其按升序排列并返回排序后的链表。示例1:输入:head=[4,2,1,3]输出:[1,2,3,4]示例2:输入:head=[-1,5,3,4,0]输出:[-1,0,3,4,5]示例3:输入:head=[]输出:[]提示:链表中节点的数目在范围[0,5*104]内-105<=N......
  • LeetCodeHot100 二分查找 35. 搜索插入位置 74. 搜索二维矩阵 34. 在排序数组中查
    35.搜索插入位置https://leetcode.cn/problems/search-insert-position/description/?envType=study-plan-v2&envId=top-100-likedpublicintsearchInsert(int[]nums,inttarget){intleft=0;intright=nums.length-1;while(left<......