AcWing 785. 快速排序

一,知识概括:

1.递归思想

2.分治思想

3.const

 二,代码示例:

#include <iostream>

using namespace std;

const int N = 100010;

int q[N];

void quick_sort(int q[], int l, int r)
{
    if (l >= r) return;

    int i = l - 1, j = r + 1, x = q[l + r >> 1];
    while (i < j)
    {
        do i ++ ; while (q[i] < x);
        do j -- ; while (q[j] > x);
        if (i < j) swap(q[i], q[j]);
    }

    quick_sort(q, l, j);
    quick_sort(q, j + 1, r);
}

int main()
{
    int n;
    scanf("%d", &n);

    for (int i = 0; i < n; i ++ ) scanf("%d", &q[i]);

    quick_sort(q, 0, n - 1);

    for (int i = 0; i < n; i ++ ) printf("%d ", q[i]);

    return 0;
}

作者:yxc
链接:https://www.acwing.com/activity/content/code/content/39784/
来源:AcWing

 三,理解思路:

 快速排序是运用了递归思想

递归是将一个问题分解为几个子问题,并通过运用同一条件推算又分解为更多的子问题,直至得到答案,一节一节返回数据出来。

要运用,就先要满足递归的两个条件

  一,可以通过递归调用用一个判断不断缩小范围或者是不断推算可以得出结果。

  二,可以退出递归调用。

而使用递归则要思考三个方面

  一,题目要你做什么?

  二,接受条件是什么?

  三,递归条件是什么?

临时模板

void quick_sort()
{
  if(结束条件){}

 quick_sort();//可放在函数外面和里面,可多可少。
return;
}

更详细的这里也有。

递归算法_周闖的博客-CSDN博客_规递算法To iterate is human, to recurse, divine.人理解迭代,神理解递归。什么是递归递归算法(英语:recursion algorithm)在计算机科学中是指一种通过重复将问题分解为同类的子问题而解决问题的方法。递归式方法可以被用于解决很多的计算机科学问题,因此它是计算机科学中十分重要的一个概念。简单地说,就是如果在函数中存在着调用函数本身的情况,这种现象...https://blog.csdn.net/Andrew_ZhouC/article/details/104621075?ops_request_misc=&request_id=&biz_id=102&utm_term=%E9%80%92%E5%BD%92%E7%AE%97%E6%B3%95&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-0-104621075.142%5Ev24%5Ehuaweicloudv2,157%5Ev15%5Enew_3&spm=1018.2226.3001.4187

分治思想:

分治是y神在课上讲的,是指把问题分成若干个小部分,用相同的条件判断达到目的,在我看来这个和递归有点像,但是递归是注重递和归,是问题里面的问题,而分治是分。在分一次不能解决问题时,分治也经常搭配递归使用以达到多次分。

使用分治的条件

   数据可以分开用同一条件判断且判断条件简单。

使用分治的步骤

 一,分

二,判断

(三,合并)

临时模板

void merge_sort()
{
   int mid = (l + r) / 2; //l是左边,r是右边。
   
   merge_sort(l, mid);
   merge_sort(mid + 1, r);
//处理条件。
   return;//可配合递归处理。
}

现在理解不透的详细资料:

分治算法详细讲解(含经典例题分析)_nan_black的博客-CSDN博客_分治算法分治法思路:将整个问题分解成若干小问题后再分而治之。如果分解得到的子问题相对来说还是太大,则可反复使用分治策略将这些子问题分成更小的同类型子问题,直至产生方便求解的子问题,必要时逐步合并这些子问题的解,从而得到问题的解。分治算法可以由递归过程来表示,因为分治法就是一种找大规模问题与小规模问题关系的方法,是递归设计的一种具体策略。步骤1.分解将原问题分解为若干规模较小,相互独立,与原问题相同的子问题。2.解决若干子问题较小而容易被解决则直接解决,否则再继续分解为更小的子问题,直到容易解决。3.https://blog.csdn.net/qq_44398094/article/details/109920912?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522165629585516782395380419%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=165629585516782395380419&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~top_positive~default-1-109920912-null-null.142%5Ev24%5Ehuaweicloudv2,157%5Ev15%5Enew_3&utm_term=%E5%88%86%E6%B2%BB%E6%B3%95&spm=1018.2226.3001.4187

 四,语法详解:

 一,const

const是类型修饰符,定义const类型的变量以后只读不改,并且可以把它看作为字符表的一员,比其他的要节约空间。(但要注意它只在文件内有用)

const int N = 100010;

如果要在其他文件使用,则要加上extern。

C语言 基础知识之const(const是什么,const的作用,const的使用)_李江林的博客-CSDN博客_const一、const是什么 const是C/C++中的类型修饰符。二、const的作用 1、对变量声明只读特性,保护变量值以防被修改 2、节省空间,避免不必要的内存分配。const修饰的变量在程序运行过程中只有一份拷贝 3、提高程序运行效率。编译器不为普通const常量分配存储空间,而是将他们保存在符号表中,这使得它成为一个编译期间的常量,没有了存储和读取内存的操作。三、const的使用 1、const和普通变量 (1)编译器在编译过程中把...https://blog.csdn.net/impossble_2017/article/details/116377599?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522165629037516782184660622%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=165629037516782184660622&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~top_positive~default-2-116377599-null-null.142%5Ev24%5Ehuaweicloudv2,157%5Ev15%5Enew_3&utm_term=const&spm=1018.2226.3001.4187

结语:

这个题目是十分基础的,问题不大。主要要记住思想,并吃透。

这是鄙人没有什么学识,如有错误,请尽情留言。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Lshyzz

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值