首页 > 编程语言 >排序算法---快速排序

排序算法---快速排序

时间:2023-08-01 10:26:34浏览次数:34  
标签:high arr int 元素 --- 算法 数组 排序

什么是快速排序?

快速排序(Quick Sort)是一种高效的排序算法,它使用分治法来将一个数组分成两个子数组,然后对这两个子数组分别进行排序,最后将它们合并成有序的数组。

快速排序的基本步骤:

1. 选择一个基准元素(pivot):从数组中选择一个元素作为基准元素。通常选择数组的第一个元素或者最后一个元素作为基准元素。

2. 分区(Partition):将数组中的元素按照基准元素进行分区,比基准元素小的元素放在基准元素的左边,比基准元素大的元素放在基准元素的右边,相同大小的元素可以放在任一边。
   分区过程中,使用两个指针,一个从左往右扫描,一个从右往左扫描,当两个指针相遇时停止。

3. 递归排序:对分区后的两个子数组分别进行快速排序,直到子数组的大小为 1 或 0(已排序),递归结束。

4. 合并:将分区后的两个子数组合并成一个有序的数组,完成排序。

Java实现


public void quickSort(int[] arr, int low, int high) {
    if (low < high) {
        // 分区,返回基准元素的索引位置
        int pivotIndex = partition(arr, low, high);
        
        // 递归排序左边子数组
        quickSort(arr, low, pivotIndex - 1);
        
        // 递归排序右边子数组
        quickSort(arr, pivotIndex + 1, high);
    }
}

private int partition(int[] arr, int low, int high) {
    // 选择基准元素,通常选择数组的最后一个元素
    int pivot = arr[high];
    
    // 定义一个指针 i,初始化为 low - 1
    int i = low - 1;
    
    // 从 low 遍历到 high - 1
    for (int j = low; j < high; j++) {
        // 如果当前元素小于基准元素,将 i 指针右移,并交换 arr[i] 和 arr[j]
        if (arr[j] < pivot) {
            i++;
            swap(arr, i, j);
        }
    }
    
    // 最后将基准元素放置在正确的位置上(i + 1),即将 arr[i+1] 和 arr[high] 交换
    swap(arr, i + 1, high);
    
    // 返回基准元素的索引位置
    return i + 1;
}

private void swap(int[] arr, int i, int j) {
    int temp = arr[i];
    arr[i] = arr[j];
    arr[j] = temp;
}

快速排序的平均时间复杂度为 O(n log n),在大多数情况下是最优的排序算法之一。
然而,在最坏情况下,如果基准元素选择不当,可能导致时间复杂度达到 O(n^2)。
为了避免最坏情况,通常可以选择合适的基准元素(如随机选择或者取中位数)来提高快速排序的性能。

标签:high,arr,int,元素,---,算法,数组,排序
From: https://www.cnblogs.com/NetUSA/p/17595702.html

相关文章

  • 22-20230801
    组内的小伙伴被打了B2,这次XX直接没找我聊了,以前如果是组内小伙伴被打了低绩效是会先给我聊,然后我再跟下面的小伙伴聊。傻儿子说是在架空我,似乎我也get到。但是现在又能怎么办呢。我的绩效其实并不差,可是我怎么也高兴不起来。漂泊在外,依靠不了任何人。我想起那天晚上失落的回......
  • react简历案例--前后端
    express:下载 mongoose 7版本+配置cors1:创建module文件夹(db.js、module.js)连接mongodb数据库:constmongoose=require("mongoose")mongoose.connect("mongodb://127.0.0.1:27017/zg6_zk3_2204_koa").then(()=>{console.log("连接成功");})mod......
  • docker-ubuntu
    第一步拉取镜像dockerpullubuntu第二步运行容器dockerrun-itd--nameu1ubuntudockerrun-itd--nameu2ubuntu第三步进入容器dockerexec-itu1bash 第四步在u1容器内运行ipaddr命令结果如下: 和在虚拟机上运行ipaddr:apt-getinstall-yiprout......
  • linux 中sed命令中-D选项
     001、-D选项用于限定只删除模式空间中的第一行[root@PC1test01]#lsdata.txt[root@PC1test01]#catdata.txt##测试数据HeaderLineFirstDataLineEndofDataLines##N选项将匹配Header的行及下一行当做一行来出列,D选项用于删除模式空间的第一行,即he......
  • MFFC-常量
     HWND_DESKTOP   桌面窗口句柄            ......
  • 冒泡排序
    第一趟:相邻比较,若前>后,交换位置,直到最后一个位置为max第二趟:相邻比较,若前>后,交换位置,直到倒数第二个位置为max(除最后一个位置)第n趟:......@Testpublicvoidtest1(){int[]arr={7,6,5,4,3,2,1,1};inttemp;//比较趟数。共leng......
  • rest-apiV2.0.0升级为simplest-api开源框架生态之simplest-jpa发布
    什么是simplestsimplest追求存粹简单和极致。旨在为项目快速开发提供一系列的基础能力,方便用户根据项目需求快速进行功能拓展不在去关心一些繁琐。重复工作,而是把重点聚焦到业务。前言程序10年。作为一个多年程序。深知每个项目和程序,都有很多重复性工作要做。入行近10......
  • 【雕爷学编程】Arduino动手做(177)---ESP-32 掌控板
    37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手尝试系列实验,不管成功(程序走通)与否,都会记录下来—小小的进步或是搞......
  • linux 中 sed命令中-n和-N选项
     001、-n(next),处理匹配行的下一行[root@PC1test01]#lsa.txt[root@PC1test01]#cata.txt##测试数据010203040506070809101112131415[root@PC1test01]#sed'/07/{n;d}'a.txt##处理匹配07行的下一行,即删除01020304050607......
  • Java面试题 P28:数据库篇:MySql篇-MySql优化-索引-什么是索引?索引的底层数据结构是什么?
    什么是索引:索引(index)是帮助MySql高效获取数据的数据结构(有序)。在数据之外,数据库还维护着满足特定查找算法的数据结构(B+树),这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构上实现高级查找算法,这种数据结构就是索引。 ......