代码编织梦想

419cd8d3968a062ddd9903bc77d2074c.png

65898729c147d0409a075cf080f7f66c.jpeg
3d2286270581fd47b3fbbc5252299dce.jpeg

图解·:测试用例 6 6 3 1 7 2 4

76fca7bb97fba9ca3a471e5d8456bb6c.jpeg

代码如下:

#include <bits/stdc++.h>
using namespace std;

void quickSort(vector<int>& arr, int left, int right) {
    if (left >= right) return;//递归出口 
    int pivot = arr[left];      //第一个元素为枢轴 
    int i = left, j = right;  //i为左指针,j为右指针 

    while (i < j) {
        while (i < j && arr[j] >= pivot) j--;//从右向左找, arr[j] >= pivot,下标右指针j--
        arr[i] = arr[j];                     // arr[j] < pivot,替换i所在位置的数字

        while (i < j && arr[i] <= pivot) i++;//从左向右找,arr[i] <= pivot,下标左指针i++
        arr[j] = arr[i];                     // arr[i] > pivot,替换j所在位置的数字
    }

    arr[i] = pivot;//i==j时,在arr[i]处插入pivot 
    
    //打印 
    for (int k = 0; k < arr.size(); k++) {
        cout << arr[k] << " ";
    }
    cout << endl;

    //以i==j的位置,将数组分为两半区,再进行递归快速排序 
    quickSort(arr, left, i - 1);
    quickSort(arr, i + 1, right);
}

int main() {
    int n;
    cin >> n;

    vector<int> arr(n);
    for (int i = 0; i < n; i++) {
        cin >> arr[i];
    }

    quickSort(arr, 0, n - 1);

    return 0;
}

容易编写错误的代码块

    while(i<j)
    {
        while(i<j&&arr[j]>=pivot) j--;
        arr[i]=arr[j];
        
        while(i<j&&arr[i]<=pivot) i++;
        arr[j]=arr[i];
    }
    arr[i]=pivot;
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_56774050/article/details/129484060

js快速排序详解——递归与非递归_凯尔宝宝的博客-爱代码爱编程_非递归快排

基本介绍: 快速排序(quickSort)是基于冒泡排序的一种改进,该排序算法采用了分治的思想,将待排序数组逐步划分两个部分,其中左半部分都要小于右半部分,再将左右部分分别进行快速排序,整个过程可采用递归进行,直到排成一个有序数列。 整体步骤: ① 选取待排序数组中其中一个数作为基数(建议选取第一个数),使flag等于基数的下标,left等于待排序数

图文演示 快速排序 - 指针法-爱代码爱编程

分治+指针交换法 快排思想: 1、给这组数据找一个基准位(一般是数组的第一位)pivot。 2、以基准位把数组分为2个子串,左边的的数据都小于等于基准位,右边的数据都大于等于基准位。 3、以同样的方式别对2个子串进行此方法排序,一直递归,直到数据排好顺序。 递归的结束条件:需要递归的子串数组只有一个数据。 给定原始数列如下,要求从小到大排序: 开局和挖

python实现冒泡排序算法的非递归版本_python快速排序递归与非递归-爱代码爱编程

快速排序递归与非递归python 写在前面 快速排序的递归函数 快排的切分函数 快排的非递归函数 完整的源代码 写在前面 众所周知,快速排序相对于选择排序,插入排序,冒泡排序等初级排序有着天然的优势。这是因为快排在交换元素的过程中,两个发生交换的元素,距离较远。比如插入排序,新的元素要在已经有序的序列中,一次又一次地找到它应该处于的位置,

快速排序(双指针法、挖坑法、前后指针法)递归、非递归实现-爱代码爱编程

前言 快速排序是交换排序中的一种,是Hoare于1962年提出的一种二叉树结构的交换排序方法,类似于二叉树的前序遍历。 主要思想: ■ 任取待排序元素序列中的某元素作为关键字。 ■ 按照该关键字将待排序集合分割成两子序列,左子序列中所有元素均小于基准值,右子序列中所有元素均大于基准值。 ■ 然后将左右子序列重复该过程,直到所有元素都排列在相应

快速排序(图解+C代码)-爱代码爱编程

关于讲解快速排序算法原理的文章已近很多了,这里就不在进行讲解,而是直接梳理思路和方法。 接下来我们将用图像模拟来一步步演示快速排序的过程,这样我们将会通过视觉和大脑一起来梳理快速排序的思路。 后文示例的C语言代码将实现图像模拟的过程。 一、图像模拟 快速排序 过程 我们选取十个数字0~9当做我们的排序数字,并将其打乱。然后我们将按照升序进

快速排序左右指针移动顺序问题-爱代码爱编程

闲来无事,突然想敲一下快排,这一敲不当紧,问题接踵而至,以前怎么就没有发现过这个问题呢......说明没有思考[笑哭] 目录 1.快排核心思想 2.快排Java实现(指针移动问题) 3.快排Java实现(问题解决) 1.快排核心思想 选择基准值(一般将数组第一个数作为基准值);双指针分别从左右两边移动,左边寻找比基准值大的数,右边找比基准值小的

c语言双重指针字符串排序,快速排序(双指针法、挖坑法、先后指针法)递归、非递归实现...-爱代码爱编程

前言 快速排序是交换排序中的一种,是Hoare于1962年提出的一种二叉树结构的交换排序方法,相似于二叉树的前序遍历。web 主要思想: ■ 任取待排序元素序列中的某元素做为关键字。 ■ 按照该关键字将待排序集合分割成两子序列,左子序列中全部元素均小于基准值,右子序列中全部元素均大于基准值。 ■ 而后将左右子序列重复该过程,直到全部元素都排列

快速排序Java详解+例题-爱代码爱编程

快速排序—>分治 快速排序 快速排序--->分治背景快排原理与过程图形展示双指针算法简介快排模板步骤:死循环解析例题quickSort方法说明: 背景 快速排序是十大排序之一 十大排序: 快排原理与过程 快速排序是通过选取一个随机值 x 进行运用双指针算法从两端遍历每一次遍历有两个指针i 与 ji 从区间左端开始j 从区间右

【数据结构】快速排序递归实现 _三种方法详解+优化-爱代码爱编程

常见的排序算法有以上八种,所以预估会分成几期来讲,感兴趣的朋友们不妨点个收藏专栏。 ღ( ´・ᴗ・` )比心 OJ链接 快速排序是Hoare于1962年提出的一种二叉树结构的交换排序方法,其基本思想为: 任取待排序元素序列中的某元素作为基准值,按照该排序码将待排序集合分割成两子序列,左子序列中所有元素均小于基准值,右子序列中所有元素均大于基

快速排序---递归以及非递归-爱代码爱编程

文章目录 一、快速排序的基本思想二、代码实现——三种递归1.hoare版本(左右指针法)2.挖坑法3.前后指针法三、代码实现——快排之非递归总结 一、快速排序的基本思想 快速排序是Hoare于1962年提出的一种二叉树结构的交换排序方法,其基本思想为:任取待排序元素序列中的某元素作为基准值,按照该排序码将待排序集合分割成两子序列,左子序列中所

C语言-快速排序算法(递归Hoare版)-爱代码爱编程

废话不多说,先看代码 #define _CRT_SECURE_NO_WARNINGS 1 //快速排序算法,递归求解 #include <stdio.h> void swap(int* a, int* b) { int c = 0; c = *a; *a = *b; *b = c; } void Compare(int arr[],

快速排序(代码+详细分析)-爱代码爱编程

目录 基本思想 图解 代码 分割数组的代码 1.hoare版本 2.挖坑法 3.前后指针法 快排代码 1.递归 2.循环 复杂度与稳定性 时间复杂度 空间复杂度 稳定性  完整代码  注意 基本思想 任取待排序元素序列中 的某元素作为基准值,按照该排序码将待排序集合分割成两子序列,左子序列中所有元素均小于基准值,右 子序

快速排序(递归)——C语言实现-爱代码爱编程

爆肝一万字,全网最详细的快速排序,你想到的,你想不到的这里都有。 🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥 文章目录 ⚽一、快速排序🏀二、快速排序之“挖坑法”🥪2.1 挖坑法思路🍟2.2 挖坑法图解🥯2.3 挖坑法动图展示🧀2.4 单趟排序的代码🌭2.5 挖坑法总体代码实现🍖2.6 递归展开图(用于理解)🏐三、时间复杂度分析✈

快速排序的非递归实现-爱代码爱编程

快速排序的递归方法在之前的博客之中已经讲过,接下来给大家介绍非递归的方法。将递归方法转换为非递归的方法时,一般会想到使用循环,但是一些算法仅仅靠循环是非常难的。这时可以考虑使用各种数据结构,比如栈,二叉树,堆等。快速排序非递归的方法则可以通过栈来实现。 我之前写的关于快速排序递归方法的讲解: https://mp.csdn.net/mp_blog/

快速排序递归实现-爱代码爱编程

快速排序 快速排序的思想就是先定义第一个元素为基准数,左右指针分别向右向左移动,直到右指针找到一个元素比基准数小,并且左指针找到一个元素比基准数大,此时交换左右指针当前指向的元素。继续移动,直到左指针与右指针重合,此时将基准数与指针重合的元素交换。如此,第一轮排序结束。再以排序好的这个数为分界线,分为左右两边数组元素,再分别以此方法递归。 代码 pu

C++的快速排序(递归和非递归版)-爱代码爱编程

C++的快速排序(递归和非递归版) 1.递归版 #include<bits/stdc++.h> using namespace std; typedef long long ll; typedef unsigned long long ull; const int N=1e3+5,M=2e4+5,inf=0x3f3f3f3f,mod=1e

python解题:双指针实现快速排序_xihuanyigeren2017的博客-爱代码爱编程

def quick_sort(li:list)->list: if len(li)>1: mid = 0 l, r = 0,len(li) - 1 while l != r: while li[r] >= li[mid] and l < r:

快速排序超详细讲解c语言_云朵c的博客-爱代码爱编程

文章目录 基本思想递归版本非递归版本Hoare法算法步骤动图演示代码实现Hoare法必须先从右边开始走 挖坑法算法步骤动图演示代码实现 前后指针法算法步骤动图演示代码实现 快速排序的两种优化方法(可合并使

java快速排序递归算法_java集合递归排序算法-爱代码爱编程

快速排序 分为双边循环法和单边循环法,先来双边循环法,双边循环法是使用双指针,首先,选定基准元素pivot,并且设置两个指针left和right,指向数列的最左和最右两个元素。接下来进行第1次循环,从right指针开始,让指针所指向的元素和基准元素做比较。如果大于或等于pivot,则指针向左移动;如果小于pivot,则right指针停止移动,切换到left

非递归算法——快速排序、归并排序-爱代码爱编程

哈喽大家好,我是保护小周ღ,本期为大家带来的是常见排序算法中的快速排序、归并排序,非递归算法,分享所有源代码,粘贴即可运行,保姆级讲述,包您一看就会,快来试试吧~ 目录 一、递归的缺陷 1.1 栈是什么,数据结构“栈”又是什么,他们之间有什么区别? 1.2 C/C++ 程序内存分配的几个区域: 二、快排非递归算法 2.1 算法思想 2