经典算法之快速排序算法

经典算法



前言

就算法而言,我们主要学习的是数学+思维+逻辑+数据结构实现功能,所以我们主要学习是思维也是解决问题的思路,然后用逻辑去实现它。。


提示:以下是本篇文章正文内容,下面案例可供参考

一、什么是快速排序?

每次选择一个元素,通过一趟的过程,前后比较,从而找到自己的合适位置,即此位置前的都比次数小,此位置之后的,都比次数大。
然后再对已经分割的两部分,重复递归使用相同的方法来找每个数的位置。递归嵌套即可完成排序。

二、代码实现

代码如下(示例):

package com.zrrd.lianxi;

import java.util.Arrays;

public class 快速排序 {
    
    
    public static void main(String[] args) {
    
    
        int[] arr = {
    
    3,6,4,5,7,13,12,1,8,2,10,9,11,14,16,15};
        queryPaiXu(arr, 0, arr.length-1);
        System.out.println(Arrays.toString(arr));
    }
    //传入数组 shuzu,a=数组长度开始为0,b=最后长度位置为shuzu.size()-1
    public static void queryPaiXu(int[] shuzu,int a,int b) {
    
    
        //定义变量i、j、k、m
        int i, j, k, m;
        //判断时候有效数组,如果开始长度大于末尾长度为无效数组,直接返回
        if (a > b) {
    
    
            return;
        }
        //将开始长度值,赋值给 i 变量
        i = a;
        //将末尾长度值,赋值给 j 变量
        j = b;
        //取到数组下角标为0的首位值,赋值给 k 变量
        k = shuzu[a];
        //循环判断,开始长度是否小于数组最大长度
        while (i < j) {
    
    
            //如果k数组首位值小于等于末位置shuzu[j] 并且 开始长度是否小于数组最大长度
            while (k <= shuzu[j] && i < j) {
    
    
                // -1  便于执行下一次判断
                j--;
            }
            //如果k数组首位值大于等于首位置shuzu[i] 并且 开始长度是否小于数组最大长度
            while (k >= shuzu[i] && i < j) {
    
    
                //   +1  便于执行下一次判断
                i++;
            }
            //最后判断,i 的值是否小于j 的值,为true执行逻辑体
            if (i < j) {
    
    
                //把数组末尾值赋给临时变量 m  用于存储
                m = shuzu[j];
                //把首位值与末位置进行交换  此时末位置存放的是首位值
                shuzu[j] = shuzu[i];
                //再把临时变量 m 赋值给首位值,就完成相邻首末数值的交换
                shuzu[i] = m;
            }
        }
        //此时 i 已经+1 变成相邻第二个位置,把他的值在赋给首位
        shuzu[a] = shuzu[i];
        shuzu[i] = k;
        //递归算法,在次调用方法执行
        queryPaiXu(shuzu, a, j - 1);
        queryPaiXu(shuzu, j + 1, b);
    }
}

效果截图:
在这里插入图片描述


总结

提示:这里主要是用到了递归的思想去优化,通过降低时间复杂度,来实现快速排序。

猜你喜欢

转载自blog.csdn.net/zhx__/article/details/121049854