高快省的排序--快排

本文深入探讨了快速排序这一高效的排序算法,基于分治思想,详细解释了其原理和Java实现。通过图解和代码展示,阐述了快速排序如何通过设置基准点,减少比较和交换次数,达到平均时间复杂度O(NlogN)的效果。同时,提供了快速排序的Java代码示例,便于理解与实践。
摘要由CSDN通过智能技术生成

引言

这篇博客我们来复习一下效率极高的排序,快速排序,用分治的思想实现的一个优雅的排序算法,是一个真正的高速,快捷,省空间的排序。诸如Java的Arrays类中的sort方法的底层源码也是用快排实现的,接下来就让我们看一下快排的实现吧。

快速排序为什么快?

快速排序之所比较快,因为相比冒泡排序,每次交换是跳跃式的。每次排序的时候设置一个基准点,将小于等于基准点的数全部放到基准点的左边,将大于等于基准点的数全部放到基准点的右边。这样在每次交换的时候就不会像冒泡排序一样每次只能在相邻的数之间进行交换,交换的距离就大的多了。因此总的比较和交换次数就少了,速度自然就提高了。当然在最坏的情况下,仍可能是相邻的两个数进行了交换。因此快速排序的最差时间复杂度和冒泡排序是一样的都是O(N2),它的平均时间复杂度为O(NlogN)。其实快速排序是基于一种叫做“二分,分治”的思想。

图解快排

图画的很丑,主要是鼠标不好用,见谅见谅,此图说明了快排的执行过程,无非是重复的用分治的思想使基准位于中间,然后两边做重复的事情,最后得到的就是一个有序的数列,这块内容我推荐去看一下《算法图解》这本书,里面用有趣的图来描述整个执行的过程,上手程度很低,一看就懂。
在这里插入图片描述

代码部分

然后上代码,代码中的注释都很详细,有不明白的可以在评论区里留言,如下

package Test.Arithmetic;

import java.util.Arrays;

public class Main {
    public static void main(String[] args) {
        // 定义一个乱序的数组
        int[] array = new int[] { 8, 2, 5, 1, 5, 9, 6, 3, 0 };
        // 调用快排函数
        QuickSort(array, 0, array.length - 1);
        // 输出
        System.out.println(Arrays.toString(array));
    }

    // 快速排序
    public static void QuickSort(int[] array, int low, int high) {
        int i, j, temp;
        if (low > high) {
            return;
        }

        // 将开始和末尾的值赋给哨兵i和j,让哨兵变化,头尾的值不可以变化
        i = low;// 哨兵i
        j = high;// 哨兵j
        temp = array[low];
        // 哨兵开始移动,一定要先移动j,等到j找到比基准temp小的时候再移动i,然后找到比temp大的值,交换i和j的值,最后i和j相遇的时候交换i或者是j的值与temp
        while (i < j) {

            // 先从右边开始移动
            while (i < j && array[j] >= temp) {
                j--;
            }

            // 再从左边开始移动
            while (i < j && array[i] <= temp) {
                i++;
            }

            // 如果当他们都找到了响应的值的话就交换他们的值
            if (i < j) {
                int t = array[i];
                array[i] = array[j];
                array[j] = t;
            }
        }

        // 最后while循环退出的话说明i和j相遇了,也就是说第一遍分治已经结束了,得到的结果就是基准值的左边都比他小,右边都比他大,接下里我们分别对两边执行相同的操作就可以了,这样就达到了目的了,递归分治
        array[low] = array[i];
        array[i] = temp;

        // 基准值两边分别递归分治
        QuickSort(array, low, j - 1);
        QuickSort(array, j + 1, high);
    }
}

结果:
在这里插入图片描述
好啦,以上就是我们复习的算法之快速排序算法所有的内容啦,有不明白的小伙伴可以留言评论哦,觉得很赞的小伙伴也可以三连哦,石石子先谢过啦~

借鉴博文:https://blog.csdn.net/shujuelin/article/details/82423852?spm=1001.2014.3001.5506

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值