首页 > 其他分享 >【模版】快速排序

【模版】快速排序

时间:2023-12-20 16:48:04浏览次数:38  
标签:arr right int 模版 Base 排序 快速 left

快速排序

基本思想

通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

算法复杂度

最差时间复杂度O(N2)
平均时间复杂度O(NlogN)

实现方法

首先,我们有一串序列需要排序a[10] = {6, 1, 2, 7, 9, 3, 4, 5, 10, 8};
我们现在从序列里面找到一个基准数(任何数字都可以),这里选择a[0]也就是6。
我们先从找到一个小于6的数,再从找到一个大于6的数,然后交换它们。

模版见下

void Quick_sort (int arr[], int left, int right) {
    if (left >= right) {
        return;
    } //递归结束条件
    int Base_Value = arr[(left+right)/2]; //选择基准值
    int i = left - 1;
    int j = right + 1;

    while (i < j) {
        do
            i++;
        while (arr[i] < Base_Value);
        do
            j--;
        while (arr[j] > Base_Value);

        if (i < j)
            swap(arr[i], arr[j]);
    }
    Quick_sort (arr, left, j); //继续排左边的
    Quick_sort (arr, j + 1, right); //继续排右边的
}

图解

更详细的解释可以看下面的文章

AcWing 785. 快速排序算法的证明与边界分析 - AcWing

标签:arr,right,int,模版,Base,排序,快速,left
From: https://www.cnblogs.com/Yukie/p/17916910.html

相关文章

  • 在线快速开发平台可以提高效率吗?
    什么是在线快速开发平台?它拥有什么样的优势特点?可以用在哪些领域?这些问题都是很多客户朋友咨询频率很高的问题,为了帮大家梳理清楚,低代码技术平台服务商流辰信息小编将为大家做一个简单的讲解。在信息化迅猛发展的今天,采用低代码开发平台可以让很多企业实现提质增效的发展目标,在线......
  • 桶排序
    桶排序计数排序&基数排序思路来源一周刷爆LeetCode,算法大神左神(左程云)耗时100天打造算法与数据结构基础到笔记内容特点:不基于比较的排序算法思路计数排序申明一个定长数组,遍历数据并在对应数值的下标频率统计加一,最后根据频率数组进行输出。待排序的数据必须有范围......
  • [LeetCode] LeetCode81. 搜索旋转排序数组II
    题目描述思路:是lc33.搜索旋转排序数组的延伸,允许包含重复元素起初:当nums[left]<=nums[mid]时,区间[left,mid]有序当nums[left]>nums[mid]时,区间[mid,right]有序但是这个题目当nums[left]==nums[mid]时,无法判断哪个区间是有序的,无法判断target位于左侧还是右侧,此时无......
  • [LeetCode Hot 100] LeetCode153. 寻找旋转排序数组中的最小值
    题目描述思路如果数组翻转后又回到升序的情况,即nums[left]<=nums[right],则nums[left]就是最小值,直接返回。如果数组翻转,需要找到数组中第二部分的第一个元素:若nums[left]<=nums[mid],说明区间[left,mid]连续递增,则最小元素一定不在这个区间里,可以直接排除,最小值在[......
  • 912. 排序数组---快速排序
    1.题目介绍给你一个整数数组 \(nums\),请你将该数组升序排列。示例1:输入:nums=[5,2,3,1]输出:[1,2,3,5]示例2:输入:nums=[5,1,1,2,0,0]输出:[0,0,1,1,2,5]提示:\(1<=nums.length<=5*10^{4}\)\(-5*10^{4}<=nums[i]<=5*10^{4}\)2.题解2.1随机化快速排......
  • 详解十大经典排序算法(五):归并排序(Merge Sort)
    算法原理归并排序的核心思想是将一个大的数组分割成多个小的子数组,然后分别对这些子数组进行排序,最后将排序后的子数组合并起来,得到一个有序的大数组。算法描述归并排序(MergeSort)是一种经典的排序算法,其原理基于分治(DivideandConquer)策略。它的核心思想是将一个大问题分割成多个......
  • 详解十大经典排序算法(四):希尔排序(Shell Sort)
    算法原理希尔排序是一种基于插入排序的排序算法,也被称为缩小增量排序。它通过将待排序的序列分割成若干个子序列,对每个子序列进行插入排序,然后逐步缩小增量,最终使整个序列有序。算法描述希尔排序(ShellSort)是一种基于插入排序的算法,由DonaldShell于1959年提出。它是插入排序的一种......
  • 堆排序
    堆排序heapInsert&heapify排序思路来源一周刷爆LeetCode,算法大神左神(左程云)耗时100天打造算法与数据结构基础到笔记内容问题描述对一个数组进行大根堆排序算法思路heapInsert:视为用户一个个插入新数值,由下往上比较heapify:视为对所有子树排序,由子树的头结点从上往......
  • [LeetCode Hot 100] LeetCode33. 搜索旋转排序数组
    题目描述思路如果nums[left]<=nums[mid],则[left,mid]有序如果nums[left]>nums[mid],则[mid,right]有序方法一:classSolution{publicintsearch(int[]nums,inttarget){if(nums==null||nums.length==0)return-1;intleft=0,ri......
  • [LeetCode Hot 100] LeetCode34.在排序数组中查找元素的第一个和最后一个位置
    题目描述思路:二分查找之寻找左右侧边界两个关键点:1.数组有序;2.时间复杂度O(logn)方法一:classSolution{publicint[]searchRange(int[]nums,inttarget){if(nums.length==0||nums==null){returnnewint[]{-1,-1};}......