快速排序算法

1.概述

快速排序算法是在分治算法基础上设计出来的一种排序算法,和其它排序算法相比,快速排序算法具有效率高、耗费资源少、容易实现等优点。

2.实现思路

快速排序算法的实现思路是:

  • 从待排序序列中任选一个元素(假设为 pivot)作为中间元素,将所有比 pivot 小的元素移动到它的左边,所有比 pivot 大的元素移动到它的右边;
  • pivot 左右两边的子序列看作是两个待排序序列,各自重复执行第一步。直至所有的子序列都不可再分(仅包含 1 个元素或者不包含任何元素),整个序列就变成了一个有序序列。

真正实现快速排序算法时,我们通常会挑选待排序序列中第一个元素或者最后一个元素作为中间元素。

3.步骤演示

1) 建立 2 个指针(命名为 lo 和 hi),分别指向序列中第一个元素和倒数第 2 个元素,如下图所示:
 


2) lo 指针向右移动,当指向的元素不小于 31 时暂停。显然,当前指向的 35 > 31,所以 lo 暂时不移动;
 


3) hi 指针向左移动,当指向的元素不大于 31 时暂停。显然,当前指向的 26< 31,所以 hi 暂时不移动;
 


4) 交换 lo 和 hi 所指元素的位置,如下图所示:
 


5) 重复执行 2~4 步,直至 lo ≥ hi。此时,将 pivot 元素与 lo 所指元素交换位置。下面的动画演示了整个分割的过程:

 4.代码实现(将第一个元素作为pivot)

/**
 * @author wangli
 * @data 2022/6/28 16:02
 * @Description:
 */
public class QuickSort {
    public static void main(String[] args) {
        int[] arr={1,4,63,5,7,9,12};
        quickSort(arr,0, arr.length-1);
        System.out.println(Arrays.toString(arr));
    }
    public static void quickSort(int[] arr, int left, int right) {
        //判断传入值是否符合
        if(left>=right){
            return;
        }
        //左右指针
        int l=left;
        int r=right;
        //中心轴pivot
        int pivot=arr[left];
        //临时交换节点
        int temp;
        //判断两个数是否符合在pivot左边的是比他小在pivot右边比他大
        while (l!=r){
            //找到比pivot小的值
            while (arr[r]>=pivot&&l<r){
                r--;
            }
            while (arr[l]<=pivot&&l<r){
                l++;
            }
            //将不符合的两个数交换位置
            temp=arr[l];
            arr[l]=arr[r];
            arr[r]=temp;
        }
        //当l和r相等时,将pivot放到中间,正好实现左边小右边大的
        arr[left]=arr[l];
        arr[l]=pivot;
        //向左边递归排序,直至无法排序为止
        quickSort(arr,left,l-1);
        quickSort(arr,r+1,right);
    }

}

5.返回

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

雨会停rain

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

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

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

打赏作者

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

抵扣说明:

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

余额充值