首页 > 其他分享 >数组排序简介-快速排序(Quick Sort)

数组排序简介-快速排序(Quick Sort)

时间:2024-10-31 20:18:38浏览次数:9  
标签:Sort 基准 元素 数组 Quick 排序 快速 指针

基本思想

        采用经典的分治策略,选择数组中某个元素作为基准数,通过一趟排序将数组分为独立的两个子数组,一个子数组中所有元素值都比基准数小,另一个子数组中所有元素值都比基准数大。然后再按照同样的方式递归的对两个子数组分别进行快速排序,以达到整个数组有序。

算法步骤

假设数组的元素个数为 n 个,则快速排序的算法步骤如下:

  1. 哨兵划分:选取一个基准数,将数组中比基准数大的元素移动到基准数右侧,比他小的元素移动到基准数左侧。
    1. 从当前数组中找到一个基准数 pivot(这里以当前数组第 1 个元素作为基准数,即 pivot=nums[low])。
    2. 使用指针 i 指向数组开始位置,指针 j 指向数组末尾位置。
    3. 从右向左移动指针 j,找到第 1个小于基准值的元素。
    4. 从左向右移动指针 i,找到第 1个大于基准数的元素。
    5. 交换指针 i、指针 j 指向的两个元素位置。
    6. 重复第 3∼5步,直到指针 i 和指针 j 相遇时停止,最后将基准数放到两个子数组交界的位置上。
  2. 递归分解:完成哨兵划分之后,对划分好的左右子数组分别进行递归排序。
    1. 按照基准数的位置将数组拆分为左右两个子数组。
    2. 对每个子数组分别重复「哨兵划分」和「递归分解」,直到各个子数组只有 1 个元素,排序结束。

我们以 [4,7,5,2,6,1,3] 为例,演示一下快速排序的整个步骤。

我们先来看一下单次「哨兵划分」的过程。

        在经过一次「哨兵划分」过程之后,数组就被划分为左子数组、基准数、右子树组三个独立部分。接下来只要对划分好的左右子数组分别进行递归排序即可完成排序。快速排序算法的整个步骤如下:

适用场景

        当需要对大量数据进行排序时,快速排序表现出色;

        对于随机分布的数据,快速排序的性能非常好。

        快速排序是一种原地排序算法,它只需要少量的额外内存空间来进行递归调用。这使得它在内存资源有限的环境中非常适用。

        在一些对时间要求较高的实时应用中,快速排序可以满足快速响应的需求

排序稳定性

        在进行哨兵划分时,基准数可能会被交换至相等元素的右侧。因此,快速排序是一种 不稳定排序算法

代码实现(golang)

func quickSort(arr []int) []int {
    if len(arr) <= 1 {
        return arr
    }
    pivot := arr[0]
    var left, right []int
    for _, v := range arr[1:] {
        if v <= pivot {
            left = append(left, v)
        } else {
            right = append(right, v)
        }
    }
    return append(append(quickSort(left), pivot), quickSort(right)...)
}

func main() {
    arr := []int{9, 7, 5, 11, 12, 2, 14, 3, 10, 6}
    fmt.Println("原始数组:", arr)
    sortedArr := quickSort(arr)
    fmt.Println("排序后数组:", sortedArr)
}

标签:Sort,基准,元素,数组,Quick,排序,快速,指针
From: https://blog.csdn.net/Runing_WoNiu/article/details/143324635

相关文章

  • order by 、sort by、distribute by、group by、cluster by的区别
    1.orderby:用途:主要用于对查询结果进行排序。返回的结果集是全局有序的。SELECT*FROMemployeesORDERBYsalaryDESC;2.SORTBY用途:主要用于对分布式查询结果进行排序。每个节点(分区)分别进行排序,但返回的结果集不一定全局有序。适用于Hive等大数据处理系统。SELEC......
  • 拓扑排序
    拓扑序1、在做DAGDP时,按拓扑序转移,状态可转移完全2、从拓扑序小的点连向拓扑序大的点,一定不会成环3、统计结点\(x\)可以到达的点数(待解决)DirectingEdges根据性质2,对有向边构成的图跑拓扑,拓扑序小的连向大的即可正确性由性质2易知,待证明P3953[NOIP2017提高组]逛公园本......
  • Day26--冒泡排序
    Day26--冒泡排序冒泡排序无疑是最为出名的排序算法之一:总共有八大排序!冒泡的代码还是相当简单的,两层循环:外层冒泡轮数,里层依次比较:江湖中人人尽皆知。我们看到嵌套循环:应该立马就可以得出这个算法的时间复杂度为O(n²)。思考:如何优化?1.冒泡排序的思路理解:一、冒泡排序的起......
  • qsort排序
    在体操比赛中,每位选手的得分是由多名裁判综合打分所得。现在已经汇总了N名选手的个人总得分(选手的编号依次为1,2,……N),请你设计程序找出第K名选手在所有选手中的排名。输入说明:第一行是N和K,N表示运动员的个数,K是选手序号;第二行依次是这N位运动员的个人总得分。输出说明:第K名(从1开......
  • xtu oj 逆序数(小数据) //冒泡排序
    题目描述给你一个序列x1,x2,…,xn,如果数对<xi,xj>,其中i<j,而xi>xj我们称之为逆序数对。一个序列的逆序数对的数目,称为这个序列的逆序数。比如说序列312,逆序数对为<3,1>和<3,2>,所以这个序列的逆序数为2。现在给你一个数字序列,请求其逆序数。输入每个样例为两行......
  • 项目进度计划中的任务如何优先排序
    项目进度计划中的任务优先排序取决于多个因素:任务的紧迫性、依赖关系、资源可用性、项目关键路径以及潜在风险。通常,在确定任务优先级时,应首先考虑关键路径上的任务,因为这些任务直接影响项目完成的总时长。接着,考虑那些有着严格截止日期或是对项目成败至关重要的任务。资源的分配......
  • 【数据结构多彩画卷】不要只会普通的二叉树了 , 你听说过用二叉树来排序吗? 【二叉搜索
    本篇会加入个人的所谓鱼式疯言❤️❤️❤️鱼式疯言:❤️❤️❤️此疯言非彼疯言而是理解过并总结出来通俗易懂的大白话,小编会尽可能的在每个概念后插入鱼式疯言,帮助大家理解的.......
  • 【信奥赛·算法基础】插入排序:算法解析与C++实现
    序言插入排序(InsertionSort)是一种简单的排序算法,就像是我们在打扑克牌时,整理手中牌的过程。一、基本原理插入排序的基本思想是:将待排序的元素插入到已经有序的部分序列中合适的位置,直到所有元素都插入完毕,整个序列就变为有序序列。二、算法步骤从第二个元素开始(假设第......
  • 排序算法在最坏情况下的性能差异:深入分析
    目录1.排序算法简介2.最坏情况示例分析2.1插入排序2.2归并排序2.3快速排序2.4堆排序3.性能差异与优化策略4.拓展知识:算法选择与优化5.结语        在软件工程中,排序算法是数据处理的基石。不同的排序算法在不同情况下表现出不同的性能。本文将通过......
  • 堆排序算法和Topk思想
    目录1>>导言2>>堆排序2.1>>通过堆结构实现堆排序2.2>>堆思想实现排序3>>Topk思想4>>代码5>>结语1>>导言    今天重点内容就是带着大家实现堆排序和Topk,堆排序分为两种,一种是直接调用堆的数据结构来实现的,另一种就是通过堆的思想实现的,Topk就是在一个数组......