快速排序

欢迎大家关注我的微信公众号:
欢迎大家关注我的微信公众号

上一篇我们聊了聊插入排序、希尔排序和冒泡排序。

传送门:【算法】排序(一)

今天我们重点讲一讲快速排序
快速排序的思路:

1、基准数:根据基准数分成左右2组,左边的都比基准数小,右边的都比基准数大。
2、分组以后,分别对组内进行排序。

假设有这样一组数据,
45 28 80 90 50 16 100 10
同学们先思考,如何通过快速排序进行排序呢?

好,我们一起来理一理快排的过程:

一、选基准数45(基准数可以是任意一个,一般选第一个)

    从序列后面往前找,找到比基准数小的进行交换;

    10 28 80 90 50 16 100 45

    从序列前面往后找,找到比基准数大的进行交换。

    10 28 45 90 50 16 100 80

    重复上面的操作:        
    从序列后面往前找,找到比基准数小的进行交换;

    10 28 16 90 50 45 100 80

    从序列前面往后找,找到比基准数大的进行交换。

    10 28 16 45 50 90 100 80

    直到前后查找的数值重复,结束第一次排序。

二、此时序列按基准数分成了3组:
{10 28 16} 45 {50 90 100 80}
这样一看,是不是左边都小于基准数,右边都大于基准数。

    然后分别对左右两组序列进行快速排序,

    左边以10为基准数,右边以50为基准数,

    重复上面的排序过程。

最终完成整个序列的排序,这就是快速排序。

原理搞懂了,那如何用代码实现呢?
话不多说,直接上代码,

但是同学们一定要先自己思考,培养自己算法思维。

package com.monkey.springdemo.utils.sort;
/**
 * 快速排序
 */
public class QuickSort {

    public static void qSort(int data[], int left, int right){

        int ll = left;  //从左边找的位置
        int rr = right; //从右边找的位置
        int base = data[left];  //取第一个数为基准数
        while (ll < rr){
            //从后往前找,找到比基准数小的进行对换
            while (ll < rr && data[rr] >= base){
                rr--;
            }
            if(ll < rr){    //防止没有找到,导致数据交换
                data[ll] = data[ll] + data[rr];
                data[rr] = data[ll] - data[rr];
                data[ll] = data[ll] - data[rr];
                ll++;   //找过的不需要再重复找一遍
            }

            //从前往后找,找到比基准数大的进行对换
            while (ll < rr && data[ll] <= base){
                ll++;
            }
            if(ll < rr){
                data[ll] = data[ll] + data[rr];
                data[rr] = data[ll] - data[rr];
                data[ll] = data[ll] - data[rr];
                rr--;
            }
        }

        //以基准数分为3部分,左边比基准数小,右边比基准数大,分别对左右进行快速排序
        if(ll > left){
            qSort(data,left,ll-1);
        }
        if(rr < right){
            qSort(data,ll+1,right);
        }
    }

    public static void main(String[] args) {

        int data[] = {45,28,80,90,50,16,100,10};
        qSort(data,0,data.length-1);
        for (int i = 0; i < data.length; i++){
            System.out.print(data[i] + " ");
        }

    }
}

如果大家对基准数左右排序那里不理解,
可以debug去跟一跟,一定要试一试,

这样对算法的理解才能更进一步。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Myname_China

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

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

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

打赏作者

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

抵扣说明:

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

余额充值