快速排序算法实现

本文介绍了快速排序算法,这是一种采用分治法的排序算法。文章详细讲解了递归实现快速排序的双边循环法和单边循环法,以及非递归方式实现快速排序的思路。在基准元素的选择上,提出了随机选取以避免最坏情况的影响。

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

一、什么是快速排序

        快速排序采用分治法的思路,对数组排序时每一轮挑选一个基准元素,然后将比基准元素大的移到数组的右边,比基准元素小的移到数组的左边,从而将数组一分为二,然后对一分为二的两部分再分别采用前面的思路,一直到整个数组有序。

二、递归实现快速排序

        快速排序算法既可以使用递归的方式实现,也可以使用非递归的方式实现。由上面的定义可知,快速排序实现主要在于元素位置的交换,对于元素位置的交换有两种方法,一种是双边循环法,另一种是单边循环法。

1、双边循环法

        首先选定基准元素pivot,然后设置两个指针left和right,分别指向数列的最左和最右两个元素。如下所示:
在这里插入图片描述
实现步骤:

  1. 从right指针开始,用right指针指向的元素与基准元素进行比较,如果大于等于pivot,则right指针向左移动;如果小于pivot,则right指针停止移动,切换到left指针;
  2. 用left指针指向的元素与基准元素作比较,如果小于等于pivot,则指针向右移动;如果大于pivot,则指针停止移动;
  3. 让left和right指针所指向的元素进行交换。
  4. 重复以上步骤,直到left=right。

具体的代码实现:

	/**
     * 递归实现快速排序
     * @param arr   待排序的数组
     * @param startIndex    数组的起始下标
     * @param endIndex      数组的结束下标
     */
    public static void quickSort(int[] arr,int startIndex,int endIndex){
   
   

        //递归结束条件:startIndex大于或等于endIndex
        if(startIndex>=endIndex){
   
   
            return;
        }

        //得到基准元素位置
        int pivotIndex=partition(arr,startIndex,endIndex);
        //根据基准元素,分成两部分进行递归排序
        quickSort(arr,startIndex,pivotIndex-1);
        quickSort(arr,pivotIndex+1,endIndex);
    }

    /**
     * 分治(双边循环法)
     * @param array   待交换的数组
     * @param startIndex    开始下标
     * @param endIndex  结束下标
     * @return
     */
    private static int partition(int[] array, int startIndex, int endIndex) {
   
   

        //取第1个位置(也可以选择随机位置)的元素作为基准元素
        int pivot=array[startIndex];
        int left=startIndex;
        int right=endIndex;

        while (left!=right){
   
   

            //控制right指针比较并左移
            while (left<right&&array[right]>pivot){
   
   
                right--;
            }
            //控制left指针比较并右移
            while (left<ri
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值