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

前言

这几天的学习排序算法,我想对我最大的改变就是对于思维的改变,改变了遇到问题就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));
    }
}

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

在这里插入图片描述

发布了92 篇原创文章 · 获赞 7 · 访问量 7538

猜你喜欢

转载自blog.csdn.net/qq_40126996/article/details/104785216