首页 > 其他分享 >快速排序,思路总结与实现

快速排序,思路总结与实现

时间:2024-11-11 19:57:14浏览次数:1  
标签:总结 index right 基准值 start pivot 思路 排序 left

思路

  1. 找基准值(pivot)
    pivot = start or end
  2. 比基准值小的放左边,大的放右边

实现

  1. 双指针,left从左到右找比基准值大的元素,right从右到左找比基准值小的元素
    找到后交换left和right指针的内容
    直到left = right
    这是递增排序,递减排序情况相反

  2. 如果pivot = start,则右指针先动,否则左指针先动
    目的:在双指针相等后,通过交换将基准值放到合适的位置上,达到划分区域的目的。
    如果不是这样,最后需要对交换的index加1或者-1

  3. 判断v[left] = v[right] 和 v[pivot] 的大小,是否需要交换
    需要准备基准值的index 进行递归
    当前索引处值比基准值小,交换位置 index = left
    否则说明所有的值都比基准值大,不需要交换位置 index = left - 1
    递归基准值左侧(start, index - 1)和右侧(index + 1, end)

代码

#include <vector>
#include <iostream>
#include <random>
#include <algorithm>

using namespace std;

vector<int> test_array = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25};

// 打印vector内容
void printVector(const string prefix, const vector<int> &vi) {
    cout << prefix;
    for (auto i : vi) {
        cout << " " << i;
    }
    cout << endl;
}

void quickSort(vector<int> &vi, int start, int end)
{
    if (start >= end)
    {
        return;
    }
    int pivot = start;
    int left = pivot + 1;
    int right = end;
    while (left < right)
    {
        while (left < right && vi[right] >= vi[pivot])
        {
            right--;
        }
        while (left < right && vi[left] <= vi[pivot])
        {
            left++;
        }
        swap(vi[left], vi[right]);
    }
    if (vi[left] < vi[pivot])
    {
        swap(vi[left], vi[pivot]);
    }
    else{
        left--;
    }
    quickSort(vi, start, left - 1);
    quickSort(vi, left + 1, end);
}


int main() {
    // 乱排有序vector
    auto rng = std::default_random_engine {};
    std::shuffle(std::begin(test_array), std::end(test_array), rng);

    // 排序前
    printVector("before:", test_array);

    // 排序
    quickSort(test_array, 0, test_array.size() - 1);

    // 排序后
    printVector("after:", test_array);

    return 0;
}

标签:总结,index,right,基准值,start,pivot,思路,排序,left
From: https://www.cnblogs.com/micro-universe/p/18540452

相关文章

  • DP 技巧总结
    DP技巧总结进行了为期接近一周的DP特训,做了很多同学找的高质量题目,也学到了很多技巧。现在来把一些感觉比较有价值的技巧进行一些统一的总结。插入型DP这个东西之前应该在选拔期间的一场周测中见过,但是隔了很久,已经有所遗忘。这次题单里出现了两道类似的题目,我都不会做。其......
  • 迟来的2023秋招总结,互联网&银行&国企&腾讯
    复制自本人知乎首先现在是2023年四月中旬,毕业的事情暂时告一段落,于是想吐槽顺便记录一下。23秋招其实是在2022年,而2022实在是这几年来行情最差的一年。犹记得20、21年秋天各个大厂号称“史上最大规模的秋招“,hc多开的薪资也高,一年比一年倒挂。当时我还觉得23年会更美好,没想到现......
  • 算法学习—归并排序
    1.算法介绍 归并算法是一种由冯·诺伊曼发明的分治算法,相较于普通排序算法时间复杂度较低,运行效率高。通常情况下,归并算法的时间复杂度为O(nlogn)。2.算法思想以及大致步骤 归并算法主要运用到了分治以及归并的思想,主要步骤如下:首先将一个无序数组分为n个有序的单个数......
  • 算法学习—快速排序
    1.算法介绍   快速排序算法是一种高效排序算法,效率相比普通排序算法较高,通常情况下时间复杂度为O(nlogn),但在最坏情况下时间复杂度会提高到O(n^2)2.算法思想和大致步骤 快速排序算法主要用到了二分和递归的思想,主要有三个步骤:(1)在数组中选取一个元素作为基准值(pivot)......
  • 十大经典排序算法-插入排序
    插入排序的代码实现虽然没有冒泡排序和选择排序那么简单粗暴,但它的原理应该是最容易理解的了,因为只要打过扑克牌的人都应该能够秒懂。插入排序是一种最简单直观的排序算法,它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排......
  • 渗透测试中登录框骚操作总结(非常详细)零基础入门到精通,收藏这一篇就够了
    由于测试过程中很多系统我们能接触到的只有一个登陆界面,所以要充分挖掘漏洞,进行深入操作登录注册万能密码绕过登录存在SQL注入的情况下,有可能使用万能密码直接登录admin'or'1'='1'--``admin'OR4=4/*``"or"a"="a``'or''='``'or1=1--有超级多登录口SQL......
  • xss-labs-master靶机1-20关解题思路
    xss-labs-master靶机1-20关解题思路xss-labs-master靶机是xss-labs作者在github上发布的后来不知道为什么就把它删了,可能是因为这个靶机属于静态页面有一个通用的推广方式(具体在后面),不过还是希望读者使用实战中的攻击手段学习,这个靶机是对XSS漏洞的专项练习,一共有二十关,也是小......
  • 20万字208道Java经典面试题总结(附答案)
    1、JDK和JRE有什么区别?JDK(JavaDevelopmentKit),Java开发工具包JRE(JavaRuntime Environment),Java运行环境JDK中包含JRE,JDK中有一个名为jre的目录,里面包含两个文件夹bin和lib,bin就是JVM,lib就是JVM工作所需要的类库。2、==和 equals 的区别是什么?对于基本类型,==比较的......
  • (动画版)排序算法 -选择排序
    文章目录1.选择排序(SelectionSort)1.1简介1.2选择排序的步骤1.3选择排序的C实现1.4选择排序的时间复杂度1.5选择排序的空间复杂度1.6选择排序的动画1.选择排序(SelectionSort)1.1简介选择排序(SelectionSort)是一种简单直观的排序算法。它的工作原理是反复......
  • # 学期(如2024-2025-1) 学号(如:20241402) 《计算机基础与程序设计》第8周学习总结
    学期(如2024-2025-1)学号(如:20241402)《计算机基础与程序设计》第8周学习总结作业信息这个作业属于哪个课程<班级的链接>(如2024-2025-1-计算机基础与程序设计)这个作业要求在哪里<作业要求的链接>(如2024-2025-1计算机基础与程序设计第一周作业)这个作业的目标<写上......