快速排序

本文介绍了快速排序这种高效的交换型排序算法,采用分而治之的思想,通过选取基准数并不断分区来达到排序目的。详细阐述了快速排序的步骤,并提供了Java实现代码。动画网址展示了排序过程,加深理解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

八大排序之快速排序

快速排序的思想:
快速排序是属于交换类型排序,采用不断的移动和比较来进行排序,快速排序是一种非常高效的排序算法,它的实现,增大了记录和比较和移动的距离,从而减少总的比较此时和移动次数。采用分而治之的思想,将一个大的问题拆成一个小的问题,小的问题拆成更小的问题。

快速排序动画网址:https://visualgo.net/zh/sorting

快速排序(英语:Quicksort),又称划分交换排序(partition-exchange sort),通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

从数列中挑出一个元素,称为"基准"(pivot)

重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区结束之后,该基准就处于数列的中间位置。这个称为分区(partition)操作。

递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。

实现代码:

public class QuickSort {
    public static void main(String[] args) {
        int []arr = new int[]{2,6,4,6,1,0,9,5,7,2,3,0};
        System.out.println(Arrays.toString(arr));
        quickSort(arr,0, arr.length-1);
        System.out.println(Arrays.toString(arr));
    }
    //快速排序,使用递归,参数为 指定数组,开始的位置,以及结束的位置。 用start指向的数作为基准数,然后其他元素和基准数比较,
    public static void quickSort(int []arr,int start,int end){
        //递归终止条件
        if(start < end){
            //只有start指针和end指针重合时停止比较
            //记录基准数以及需要排序的下标
            int stand = arr[start];
            int low = start;
            int high = end;
            while (low < high){
                //如果end指针指的数比基准数大 , high指针就往前移动,不需要交换数据
                while (low < high && stand <= arr[high]) {
                    high -- ;
                }
                //如果比基准数小 ,将High指针指向的数复制到low指针,此时low指针指向的数是比基准数小的,所以就会执行下一步,low指针往前移
                arr[low] = arr[high];
                //low指针指向的数比基准数小 ,low指针前移
                while (low < high && stand >= arr[low]){
                    low ++;
                }
                //否则将low指针指向的数复制到high指针上,此时high指针的数又比基准数小,又会执行第一步
                arr[high] = arr[low];
            }
            arr[low] = stand;
            quickSort(arr,start,low);
            quickSort(arr,low+1,end);
        }
    }
}

就是先选中一个基准数,先把比基准数小的移到基准数前面,比基准数的往后挪,不断的递归

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

且-听风吟.

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

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

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

打赏作者

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

抵扣说明:

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

余额充值