【我的Java学习笔记】排序算法:快速排序

九层之台,起于垒土,你我皆是垒土人
欢迎关注点赞,共同学习进步!

前言:七大排序之快速算法,总的来说并不算容易理解,需要自己去亲手实践和思考。


1、快速排序

1.1排序算法

首先要明白快速排序算法其实也是交换排序的一种
在这里插入图片描述


2、快速排序原理

2.1 排序原理解析

快速排序原理是在数据头部或尾部设立一个Key,然后分别左边left以及最右边right反向遍历,如果right指针找到比Key小的数则暂停,当left指针找到比Key值大的数时暂停,交换left和right的值,直到它们相遇,那么交换left和Key的值,并且返回left,这个Key索引就是数据中的中间值,Key的左边都比其小,右边比其大。
动图演示如下:

在这里插入图片描述

public static int  PartSort(int Arrys[],int left,int right)
    {
        int Key=left;//设置最左边为Key

        while (left<right){

            while (left<right && Arrys[right]>=Arrys[Key] ) //先右向左开始找小于Key的值
            {
                right--;
            }

            while (left<right && Arrys[left]<=Arrys[Key] )//从左向右边开始找大于Key的值
            {
                left++;
            }

            //如果满足条件就交换left和right的值
            int Middle=Arrys[left];
            Arrys[left]=Arrys[right];
            Arrys[right]=Middle;
        }
        //最后left和right相遇,交换left和Key值,并返回left,即找到数据中的中间值位置
        int Middle=Arrys[left];
        Arrys[left]=Arrys[Key];
        Arrys[Key]=Middle;
        return left;
    }

3、快速排序的实现

通过局部的单词快速排序获得Key的位置,再将数据分割成Key左右两个部分,通过递归实现多次排序,当begin和end值相等时退出,实现最后的排序。

3.1 一组无序数据:

给出一组数据


 public  static void QuickSort(int Arrys[],int begin,int end)
    {
        if (begin>=end)
            return;
        int Key=PartSort(Arrys,begin,end);
        QuickSort(Arrys,begin,Key-1);
        QuickSort(Arrys,Key+1,end);

3.2 实现结果

在这里插入图片描述

请问你学会了吗??
欢迎点赞关注!!

4、完整代码

public class QuickSort {
    public static void main(String args[])
    {
        int Arrys[]={32,18,23,45,79,88,20,84,97,6};

        QuickSort(Arrys,0,Arrys.length-1);
        for(int i:Arrys)
        {
            System.out.print(i+",");
        }
    }
    public static int  PartSort(int Arrys[],int left,int right)
    {
        int Key=left;//设置最左边为Key

        while (left<right){

            while (left<right && Arrys[right]>=Arrys[Key] ) //先右向左开始找小于Key的值
            {
                right--;
            }

            while (left<right && Arrys[left]<=Arrys[Key] )//从左向右边开始找大于Key的值
            {
                left++;
            }

            //如果满足条件就交换left和right的值
            int Middle=Arrys[left];
            Arrys[left]=Arrys[right];
            Arrys[right]=Middle;
        }
        //最后left和right相遇,交换left和Key值,并返回left,即找到数据中的中间值位置
        int Middle=Arrys[left];
        Arrys[left]=Arrys[Key];
        Arrys[Key]=Middle;
        return left;
    }
    public  static void QuickSort(int Arrys[],int begin,int end)
    {
        if (begin>=end)
            return;
        int Key=PartSort(Arrys,begin,end);
        QuickSort(Arrys,begin,Key-1);
        QuickSort(Arrys,Key+1,end);


    }


}

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kook小辉的进阶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值