排序算法-快速排序

Leetcode链接:. - 力扣(LeetCode)

快速排序:随机选一个基准数据,通过一趟排序将待排序的记录分割成独立的三部分,第一部分记录的数组小于基准数据,第二部分记录的数组等于基准数据,第三部分记录的数组大于基准数据,过程执行完,基准数据已经在数组中的正确位置,递归地进行这个过程,直到整个序列有序为止。

1.设置两个区域,分别为<区(小于基准数据num)和>区(大于基准数据num)

2.随机再数组中选一个基准数据num,遍历数组arr[i];

2.1 如果arr[i]<num,arr[i]和<区的下一个数据交换,<区右移一位,i++;

2.2 如果arr[i]=num,i++;

2.3 如果arr[i]>num,arr[i]和>区的前一个数据交换,>区左移一位,i不变。

java 复制代码
class Solution {
    public int[] sortArray(int[] nums) {
        quickSort(nums,0,nums.length-1);
        return nums;
    }

    public void quickSort(int[] arr ,int l,int r){
        if(l<r){
            //随机选取一个基准数跟r交换(基准数最好是随机选取的,减小最坏情况的可能)
            swap(arr,l+(int)(Math.random() * (r-l+1)),r);
            //p存放等于基准数的左右边界
            int[] p=partition(arr,l,r);
            quickSort(arr,l,p[0]-1); //<区
            quickSort(arr,p[1]+1,r);//>区
        }
    }

    public int[] partition(int[] arr,int l,int r){
        int small = l-1;
        int big =r;

        while(l<big){
            //arr[l]<基准数,arr[l]和arr[small]的下一个数交换,small右移一位,l加一
            if(arr[l]<arr[r]){
                swap(arr,++small,l++);
            //arr[l]>基准数,arr[l]和arr[big]的前一个数交换,big左移一位,l不变
            } else if(arr[l]> arr[r]){
                swap(arr, --big,l);
            //arr[l]=基准数,l加一
            }else {
                l++;
            }
        }
        //交换arr[big]和基准数
        swap(arr,big,r);
        return new int[]{small+1,big};
    }


    public void swap(int[] arr, int a,int b){
       int temp=arr[a];
		arr[a]=arr[b];
		arr[b]=temp;
    }
    
}
相关推荐
mjhcsp18 分钟前
C++ 递推与递归:两种算法思想的深度解析与实战
开发语言·c++·算法
_OP_CHEN24 分钟前
算法基础篇:(三)基础算法之枚举:暴力美学的艺术,从穷举到高效优化
c++·算法·枚举·算法竞赛·acm竞赛·二进制枚举·普通枚举
m0_7482480230 分钟前
《详解 C++ Date 类的设计与实现:从运算符重载到功能测试》
java·开发语言·c++·算法
天选之女wow32 分钟前
【代码随想录算法训练营——Day61】图论——97.小明逛公园、127.骑士的攻击
算法·图论
aloha_78938 分钟前
测试开发工程师面经准备(sxf)
java·python·leetcode·压力测试
im_AMBER1 小时前
Leetcode 47
数据结构·c++·笔记·学习·算法·leetcode
我命由我123451 小时前
Java 并发编程 - Delay(Delayed 概述、Delayed 实现、Delayed 使用、Delay 缓存实现、Delayed 延迟获取数据实现)
java·开发语言·后端·缓存·java-ee·intellij-idea·intellij idea
北城以北88881 小时前
SSM--MyBatis框架之缓存
java·缓存·intellij-idea·mybatis
kyle~1 小时前
算法数学---差分数组(Difference Array)
java·开发语言·算法
曹朋羽1 小时前
Spring EL 表达式
java·spring·el表达式