快速排序的理解和Java的实现

快速排序

最近在面试题中经常看到说要手写一个快排,但是好久不接触都有些生疏,今天又复习了一遍

快速排序的实现方式

个人对于快速排序的理解是,通过设定一个基准数,找到这个基准数的在整个数组中适合的位置,即基准数的左边都小于这个基准数,基准数的右边都大于这个基准数。
在这个时候,基准数左边和右边并不是有效的排序,只是统一的都大于或小于基准数,然后我们就可以更换基准数,然后通过递归的方式直接把这个数组进行有效的排序
借用一张看到的别的大佬发的图qwq:
快速排序的实现方式

快速排序的复杂度分析

  • 时间复杂度
    快速排序的平均时间复杂度是:O(nlogn)
  • 空间复杂度
    最优的情况下空间复杂度为:O(logn) ;每一次都平分数组的情况
    最差的情况下空间复杂度为:O( n ) ;退化为冒泡排序的情况

Java代码的实现

public class QuickSort {
    public static void main(String[] args) {
        int[] arr = {10,7,2,4,7,62,3,4,2,1,8,9,19};
        quickSort(arr, 0, arr.length-1);
        for (int i = 0; i < arr.length; i++) {
            System.out.println(arr[i]);
        }

    }
    
    private static void quickSort(int[] arry,int left,int right){
        if (left>right){
            return;
        }
        int base=arry[left];
        int i=left;
        int j=right;
        
        while (i<j){
            //从右边开始递减
            while (arry[j]>=base&&i<j){
                j--;
            }
            //回到左边递减
            while (arry[i]<=base&&i<j){
                i++;
            }
            
            //如果这两种情况都出现了,则会进行到这里,就把两个数交换
            int t=arry[j];
            arry[j]=arry[i];
            arry[i]=t;
        }
        
        //然后跳出这个循环,把base的值更新,这里就相当于一个arry[left]和arry[i]的交换
        arry[left]=arry[i];
        arry[i]=base;
        
        //递归调用
        quickSort(arry,left,i-1);
        quickSort(arry,j+1,right);
        
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值