排序算法之快速排序

快速排序

特点:高效,时间复杂度为nlogn。
原理:采用分治法的思想:首先设置一个中间值(一般以数组的第一个元素),然后以这个中间值为划分基准将待排序序列分成比该值大和比该值小的两部分,将这两部分再分别进行快速排序
直到序列只剩下一个元素

快速排序实现步骤:

1、选择一个基准点(一般为数组的第一个元素)
2、选择记录排序的开始下标(low),终点(high)下标。
3、循环终点下标所指元素和基准点比较,前者大,不动位置,下标-1
4、碰到比基准点小的数据,将其赋值给low下标指向的元素。(第一次覆盖的是基准点的位置。下面的覆盖都是交换完之后覆盖的。)
5、循环开始下标(low)所指元素和基准点比较,前者小的,不动位置,下标++
6、碰到比基准点大的数据,将其赋值给high下标指向的元素。
7、循环完毕,开始下标和终点下标重合,将基准点赋值给重合位置的元素。
8、第一遍排序完成。
9、将排序完成的分为两部分,继续递归排序,
基准点左边的小的数据递归排序
基准点右边的大的数据递归排序(需要增加递归结束条件)

在这里插入图片描述

图片来自网络,侵删

public class QuickSort {
    public static void main(String[] args) {
        int[] arr={3,2,6,1,8,9,7,0,4,4};
        quickSort(arr,0,arr.length-1);
        //System.out.println(Arrays.toString(arr));//一次排序结果:[0, 2, 3, 1, 8, 9, 7, 6, 4, 4]
        System.out.println(Arrays.toString(arr));//排序结果:[0, 1, 2, 3, 4, 4, 6, 7, 8, 9]
    }
    //快速排序采用的是分治法+递归
    /**
     * @param start 数组开始排序的位置
     * @param end 数组结束排序的位置
     *
     * */
    public static void quickSort(int[] arr,int start,int end)
    {
        if(start<end)
        {
            //定义一个基准点。不能写arr[0],因为后面还需要递归使用。
            int basic = arr[start];
            //记录排序的下标
            int low = start;
            int high = end;

            //循环查找比基准线大或小的数据
            while(low<high)
            {
                //找到比基准线大的数据不动位置,hight下标继续往前移动。
                while(low<high&&basic<=arr[high])
                {
                    high--;
                }
                //直到找到比基准线小的数据,执行将小的数据替换到基准线左边
                arr[low]=arr[high];
                //找到比基准线小的数据不动位置,low下标继续往后移动。
                while(low<high&&arr[low]<=basic)
                {
                    low++;
                }
                //直到找到比基准线大的数据,执行将大的数据替换到基准线右边
                arr[high]=arr[low];
                //再次进入循环
            }
            //low和high重合之后,将标准数付给重合的位置
            arr[low]=basic;
            //将其分为两部分再次递归快速排序
            quickSort(arr,0,low);
            quickSort(arr,low+1,end); //需增加结束条件。start<end,每次low+1,直到low>end
        }


    }

}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

清枫cc

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

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

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

打赏作者

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

抵扣说明:

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

余额充值