首页 > 其他分享 >快速排序

快速排序

时间:2024-04-13 22:37:02浏览次数:26  
标签:检索 arr right int 基准 排序 快速 left

手写快速排序:

package com.atguigu.react2024;


import java.util.Arrays;

public class QuicklySort {

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

    /**
     * 逻辑:会先把这个数组中的一个数当作基准数,一般会把数组的最左边的数当作基准数。
     * 然后从两边进行检索。先从右边检索比基数小的,再从左边检索比基数大的。
     * 如果检索到了,就停下,然后交换两个元素。然后再继续下去。
     * @param arr
     * @param left
     * @param right
     */

    public static void quickSort(int[] arr, int left, int right) {

        //如果左边索引比右边索引大,是不合法,直接返回
        if (left > right) {
            return;
        }

        //保存基准数
        int base = arr[left];
        //定义变量i,指向最左边
        int i = left;
        //定义变量j,指向最右边
        int j = right;

        //当i和j不相遇的时候,在循环中进行检索
        while (i != j) {
            //向由j从右往左检索比基准数小的,如果检索到比基准数小的就停止;
            //如果检索到比基准数大的或相等的,就继续检索
            while (arr[j] >= base && i < j) {
                j--;//j从右往左移动
            }

            //i从左往右检索
            while (arr[i] <= base && j > i) {
                i++;//i从左往右移动
            }

            //代码走到这里,i停下,j也停下,然后交换i和j位置的元素
            int temp = arr[i];
            arr[i] = arr[j];
            arr[j] = temp;

        }

        //如果上面的while循环的条件不成立,会跳出这个循环,往下执行
        //如果这个条件不成立说明i和j相遇了;如果i和j相遇了,就交换基准数这个元素和相遇位置的元素
        //把相遇位置的元素赋值给基准数这个位置的元素
        arr[left] = arr[i];
        //把基准数赋值给相遇位置的元素
        arr[i] = base;

        //基准数在这里就归位了,左边的数都比它小,右边的数都比它大
        //排基数的左边
        quickSort(arr, left, i - 1);
        //排基数的右边
        quickSort(arr, j + 1, right);

    }
}

 

标签:检索,arr,right,int,基准,排序,快速,left
From: https://www.cnblogs.com/odada/p/18133494

相关文章

  • hive窗口分析函数使用详解系列二之分组排序窗口函数
    1.综述我们讨论面试中各大厂的SQL算法面试题,往往核心考点就在于窗口函数,所以掌握好了窗口函数,面对SQL算法面试往往事半功倍。已更新第一类聚合函数类,点击这里阅读hive窗口函数聚合函数类本节介绍Hive聚合函数中的第二类聚合函数:分组排序窗口函数。这些函数的用法不仅仅适用于......
  • SpringBoot项目中对定义的多个Aspect类排序
    代码示例@ConfigurationpublicclassAspectConfig{@Aspect@Component@Order(Ordered.HIGHEST_PRECEDENCE)publicstaticclassLogAspect{@Pointcut("execution(public*com.imooc.spring.web..*.*(..))")publicvoidwe......
  • 排序算法-快速排序
    排序算法-快速排序一、快速排序介绍1.1原理介绍快速排序(QuickSort)是一种常用的排序算法,也是一种基于分治思想的排序算法。快速排序的基本思想是选取一个基准元素,将数组分成两部分,使得左边部分的元素都小于等于基准元素,右边部分的元素都大于等于基准元素,然后对左右两部分分别......
  • 排序算法
    排序算法1.排序算法定义:排序算法是一种将数据元素按特定顺序(通常是升序或降序)排列的算法。排序是计算机科学中最基本的操作之一,用于数据组织和优化搜索算法等。2、排序算法分类快速排序归并排序堆排序冒泡排序快速排序:快速排序是一种高效的分治排序算法,通过选定一个'......
  • P1155 [NOIP2008 提高组] 双栈排序
    P1155[NOIP2008提高组]双栈排序有思维的二分图染色题。对于“双”类的题目,我们通常分开考虑单个时的性质。对于一个栈,有一个基本的定理:若出现\(i<j<k\),有\(a_k<a_i<a_j\),那么一定不合法,即没有合法的出栈顺序使之有序。对于两个栈,我们相当于把序列分成两部分,使每部分之间......
  • 记录协助Javaer硬件快速开发过程之Web技术栈对接施耐德网络IO网关
    前一段时间有个Java技术栈的朋友联系到我,需要快速对接现有的无人值守称重系统,这里的对接是指替代现有系统,而非软件层面的对接,也就是利用现有的硬件开发一套替代现有软件的自动化系统。主要设备包括地磅秤、道闸、红外对射传感器、摄像头、小票打印、LED显示屏等等,全程使用LED显示......
  • bufDataSet排序
    https://wiki.lazarus.freepascal.org/How_to_write_in-memory_database_applications_in_Lazarus/FPC SortingDBGridonTitleClickeventforTBufDataSetIfyouwishtoenableconsecutiveascendinganddescendingsortingofaDBGridshowingsomedatafromTBufD......
  • 常见的排序算法——冒泡排序(二)
    本文记述了冒泡排序微小改动的基本思想和一份参考实现代码,并在说明了算法的性能后用随机数据进行了验证。◆思想更少的比较可以节省一定的时间,此改动可以减少更小范围的比较。(把水平陈列的数组逆时针旋转90°后,有助于理解后续的内容。)将包含顶层以下的所有元素作为待排序范围......
  • 常见的排序算法——冒泡排序
    本文记述了冒泡排序的基本思想和一份参考实现代码,并在说明了算法的性能后用随机数据进行了验证。◆思想(把水平陈列的数组逆时针旋转90°后,有助于理解后续的内容。)将包含顶层以下的所有元素作为待排序范围,将该范围以上的所有元素作为已排序范围。通过一一比较相邻的两个元素,自......
  • 快速获取MD3800i存储管理口IP地址的方法
    快速获取MD3800i存储管理口IP地址的方法打开抓包软件wireshark,选取抓包网卡后,用笔记本电脑随便设置个IP地址,笔记本网口网线直连MD3800i管理口网口,等待一会就能看到DHCP信息,是MD3800i请求获取DHCP。获取不到DHCP分配的IP后,MD3800i会改成存储默认IP地址,会发ARP包。用抓包软件直接能......