《排序算法》系列 -浅显易懂的认识---快速排序

news/2024/5/19 23:23:50 标签: 算法, 快速排序, 数据结构, 排序算法

前言

这几天的学习排序算法,我想对我最大的改变就是对于思维的改变,改变了遇到问题就for循环,不行就再继续套循环。。。。。
解决问题的思维不能死,可以另辟思维去想,当把一种排序算法的逻辑理清楚,会惊叹这种想法,原来可以这样去解决问题,我想这是对于思维的最大开阔。
在这里插入图片描述

今天上的是快速排序,而且经过自己的学习发觉排序中好多都用到了递归的思想,通过递归来解决好多问题,这也是自己以后在项目中需要加强的。

好了,废话不多说,上代码!
在这里插入图片描述

import java.util.Arrays;

/**
 * @author Administrator
 *
 * 快速排序中,需要介入分区点
 * 通过分区点将数组分为三部分,第一部分是小于分区点的值,第二部分是分区点的值,第三部分是大于分区点的值
 * 然后通过递归的思想将第一分区和第三分区再进行通过分区点来分区,直到分到的值的长度都为1
 * 此时将这些值连接起来就是快速排序的结果
 *
 *
 * 1、从数组中找到一个分区点
 * 2、重新排序数组,所有元素和分区点元素进行比较
 *  如果比分区点小,则放在分区点左边
 *  如果比分区点大,则放在分区点右边
 *  3、对左边和右边的数组进行递归的排序
 *
 *
 *
 *  快速排序中,找到默认的分区点为数组的最后一个元素
 *  然后定义一个分区点的下标,默认为begin
 *  然后将分区点的元素与数组的其它元素进行比较,然后交换位置
 *  最后得到   (小于分区点的元素)、分区点、(大于分区点的元素)
 *  最后返回分区点的下标
 */
public class quickSort {

    /**
     * 快速排序方法
     * 通过递归和分区的思想实现
     *
     * 将传入的数组通过返回分区点的方法,返回对应的分区点下标
     * 然后通过该下标将数组进行分区,分为左侧和右侧
     * 对左侧和右侧的数组再进行寻找分区点进行分区(使用递归的方法)
     * 最后数组的长度为1不可分时,则递归终止
     *
     *
     * @param array
     * @param begin
     * @param end
     */
    public void quickSort(int[] array,int begin,int end){
        //校验。递归的终止条件
        if (array.length<2||begin>=end){
            return;
        }
        //进行分区,得到分区的下标
        int pivotIndex = partition(array,begin,end);


        //对左侧的数组进行快速排序
        quickSort(array,begin,pivotIndex-1);

        //对右侧的数组进行快速排序
        quickSort(array,pivotIndex,end);

    }


    /**
     * 返回分区点方法
     *
     *
     * 快速排序中,找到默认的分区点为数组的最后一个元素
     * 然后定义一个分区点的下标,默认为begin
     * 然后将分区点的元素与数组的其它元素进行比较,然后交换位置
     * 最后得到   (小于分区点的元素)、分区点、(大于分区点的元素)
     * 最后返回分区点的下标
     * @param array
     * @param begin
     * @param end
     * @return
     */
    public int partition(int[] array,int begin,int end){
        //设定一个默认分区点为默认数组的最后一个元素
        int pivot = array[end];
        //设定分区点的下标
        int partition = begin;
        //执行for循环将传进来的数组通过分区点进行分区
        for (int i = begin; i < end; i++) {
            //判断该区间有小于pivot的元素,则将该元素从区间头一直向后填充
            if (pivot>array[i]){
                if (i>partition){
                    //数据元素进行交换
                    swap(array,i,partition);
                }
                partition++;
            }
        }
        swap(array,partition,end);
        return partition;
    }

    /**
     * 交换方法
     * @param array
     * @param i
     * @param j
     */
    public void swap(int[] array,int i,int j){
        int temp = array[j];
        array[j] = array[i];
        array[i] = temp;
    }


    public static void main(String[] args) {
        quickSort mergeSort = new quickSort();
        int[] arr = new int[5];
        arr[0]=5;
        arr[1]=2;
        arr[2]=6;
        arr[3]=9;
        arr[4]=0;
        System.out.println(Arrays.toString(arr));
        mergeSort.quickSort(arr,0,arr.length-1);
        System.out.println(Arrays.toString(arr));
    }
}

具体的逻辑我也不重复说了,代码中写了自己对于快速排序的逻辑,希望能有帮助,另外希望在对于有问题的地方,能给予提出,毕竟自己的理解可能会有偏差!多谢!

在这里插入图片描述


http://www.niftyadmin.cn/n/1366618.html

相关文章

什么?搞Java的你还不会Spring?一篇文章带你掌握

前言 今天看到了大佬的这篇博客&#xff0c;真的认识很多&#xff0c;所以自己想要搬运一下自己想要看时&#xff0c;可以随时看。觉得写的真的很全面很细致了。膜拜大佬 Spring容器 在SpringIOC容器读取Bean配置创建Bean之前&#xff0c;必须对它进行实例化。只有在容器实例…

SpringBoot集成MongoDB做日志存储

前言 今天翻出了以前的一个项目&#xff0c;发现对于日志的存储&#xff0c;是存储在数据库中的&#xff0c;将对应的入参、出参、请求方式、请求路径等信息存储在数据表中&#xff0c;想到这样的存储如果时间久了该数据表的数据量会很大&#xff0c;想到用MongoDB试试做日志的…

关于HashMap的高频面试题

前言 今天上班看到一篇博文很好&#xff0c;是自己没有了解过的&#xff0c;今天抽空也写个博文记录一下这部分知识点&#xff0c;加强自己的知识积累&#xff01; 好了言归正传&#xff1a; 1、那你跟我讲讲HashMap的内部数据结构&#xff1f; 目前我用的是JDK1.8版本的&…

SpringBoot集成Jwt实现用户登录

前言 最近正在搭建一个SpringBootVue的一套后台管理系统的模板&#xff0c;对于用户登录的功能使用了JWT来实现的&#xff0c;自己在学习SpringCloud微服务时使用的就是JWT&#xff0c;通过Cookie来传递token&#xff0c;实现用户的登录状态。 以下就是自己在SpringBoot中集成J…

Java并发编程之原子性-Atomic源码详解

1、Atomic中存在Atmomicxxx的类&#xff0c;都是通过CAS来实现原子性的。 对于平时适用count问题&#xff0c;count并不是线程安全的&#xff0c;所以在多线程情况下&#xff0c;适用count会出现得到的值并不是我们期望的值。 问题如下&#xff1a; 所以为了解决此类问题我们需…

SpringBoot + Redis 分布式锁:模拟抢单(附实现源码)

前言 前段时间面试时被频繁问到一个Redis的问题就是如何通过Redis实现分布式锁&#xff0c;自己虽然平时使用Redis&#xff0c;但是并没有去实现过这个问题&#xff0c;今天正好看到一篇公众号文章&#xff0c;就通过代码去实现该问题。 实现Redis的分布式锁&#xff0c;通过…

Java8 ConcurrentHashMap详解-从源码分析

前言 前段时间自己一直在面试&#xff0c;很多面试官都会问到一个问题就是让我介绍ConcurrentHashMap是如何实现多线程操作的&#xff0c;以及与HashTable有什么区别&#xff1f;我自己虽然了解了一些这类的知识&#xff0c;但是也只是皮毛&#xff0c;没有深入了解过其中的实现…

二叉树、平衡二叉树、红黑树、B-Tree、B+Tree解析(上)

前言 前几天学习了ConcurrentHashMap的一些结构&#xff0c;了解了底层通过链表以及红黑树来实现的数据结构&#xff0c;所以在此基础上想要学习红黑树的一些知识。当然了既然要学习红黑树就要从二叉树、平衡二叉树进行学习&#xff0c;毕竟红黑树是在平衡二叉树的基础上进行变…