算法训练之快速排序
创始人
2025-05-31 11:01:13

数据结构学习

  • 学习内容的原始链接
  • 算法简单介绍以及解析
    • 快速排序的思路
    • 算法图解
    • 算法的总体思路
  • 快速排序算法题
    • 【模板】快速排序
      • 题目描述
      • 输入格式
      • 输出格式
      • 样例 #1
        • 样例输入 #1
        • 样例输出 #1
    • 提示
    • 题解
    • 2.第 k 小整数
      • 题目描述
      • 输入格式
      • 输出格式
      • 样例 #1
        • 样例输入 #1
        • 样例输出 #1
    • 提示
    • 解析
  • 学习新得体会

这里附上我老婆的照片,每天激励我学习
ALT

学习内容的原始链接

主要学习内容是来自浙江大学的数据结构的学习,感兴趣的可以自己去看一下哦~

算法简单介绍以及解析

我们今天学习的算法是快速排序

其时间复杂度是 o(nlogn)o(nlogn)o(nlogn)的调整序列中元素的位置,对于序列中元素的指标并没有统一的规定,一般以A[1]A[1]A[1]作为基准进行排序,使得A[1]A[1]A[1]左侧所有元素不超过A[1]A[1]A[1],右侧所有元素大于A[1]A[1]A[1]

快速排序的思路

① 调整序列中的元素,使得当前序列最左端的元素调整后满足左侧所有元素均不超过该元素,右侧所有元素均大于该元素
②对该元素的左右两侧分别进行递归 ①的调整,直到当前调整区间的长度不超过1

算法图解

在一个乱序的数组当中找到一个值放入到temp当中,让后使用leftleftleft和rightrightright两个指针进行分析
在这里插入图片描述
在这里插入图片描述

算法的总体思路

  1. 先将A[1]A[1]A[1]存至某一个临时变量temp,并令下标left,right分别指向序列的首位
  2. 只要right指向的元素A[right]A[right]A[right]大于temp,就将right左移(right++),当某个时候A[right]≤tempA[right]\le tempA[right]≤temp 时,将元素A[right]A[right]A[right]挪到left指向的元素A[left]A[left]A[left]
  3. 只要left指向的元素A[left]A[left]A[left]不超过temp,就将left右移(left–),当某个时候A[left]≥tempA[left] \ge tempA[left]≥temp 时,将元素A[left]A[left]A[left]挪到right指向的元素A[right]A[right]A[right]
  4. 重复第二,三步直到两个指针leftright相遇,把temp当存储的值放到两个指针相遇的地方

快速排序算法题

【模板】快速排序

题目描述

利用快速排序算法将读入的 NNN 个数从小到大排序后输出。

快速排序是信息学竞赛的必备算法之一。对于快速排序不是很了解的同学可以自行上网查询相关资料,掌握后独立完成。(C++ 选手请不要试图使用 STL,虽然你可以使用 sort 一遍过,但是你并没有掌握快速排序算法的精髓。)

输入格式

第 111 行为一个正整数 NNN,第 222 行包含 NNN 个空格隔开的正整数 aia_iai​,为你需要进行排序的数,数据保证了 aia_iai​ 不超过 10910^9109。

输出格式

将给定的 NNN 个数从小到大输出,数之间空格隔开,行末换行且无空格。

样例 #1

样例输入 #1

5
4 2 4 5 1

样例输出 #1

1 2 4 4 5

提示

对于 20%20\%20% 的数据,有 N≤103N\leq 10^3N≤103;

对于 100%100\%100% 的数据,有 N≤105N\leq 10^5N≤105。

题解

#include
using namespace std;const int N=100010;
int q[N];
int 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(ido i++;while(q[i]x);if(iscanf("%d",&n);for(int i=0;i

2.第 k 小整数

题目描述

现有 nnn 个正整数,要求出这 nnn 个正整数中的第 kkk 个最小整数(相同大小的整数只计算一次)。

输入格式

第一行为 nnn 和 kkk; 第二行开始为 nnn 个正整数的值,整数间用空格隔开。

输出格式

第kkk个最小整数的值;若无解,则输出 NO RESULT

样例 #1

样例输入 #1

10 3
1 3 3 7 2 5 1 2 4 6

样例输出 #1

3

提示

n≤10000n \leq 10000n≤10000,k≤1000k \leq 1000k≤1000,正整数均小于 300003000030000。

解析

#include
using namespace std;
const int N=100010;
int q[N];
int n,k,y;
void del(int q[])//删除重复数值
{for(int i=1;i<=n;++i){for(int j=i+1;j<=n;++j){if(q[i]==q[j]){for(int y=j;yq[y]=q[y+1];}n--;j--;}}}
}
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(ido i++;while(q[i]x);if(iscanf("%d %d",&n,&k);for(int i=1;i<=n;++i)scanf("%d",&q[i]);del(q);quick_sort(q,1,n);//for(int i=1;i<=n;++i)if(n>=k)printf("%d",q[k]);else printf("NO RESULT");return 0;
}

学习新得体会

今天的学习内容是什么呢?就是我们的今日份学习内容[根据需要进行修改]

相关内容

热门资讯

投资者提问:请问董秘,当前中日... 投资者提问:请问董秘,当前中日关系陷入僵局乃至谷底之际,公司有规划更多使用国产光刻胶等材料来替代日系...
富德生命人寿咸阳中心支公司被罚... 12月16日金融一线消息,据咸阳金融监管分局行政处罚信息公开表显示,富德生命人寿保险股份有限公司咸阳...
市场监管总局:抓紧推进出台《互... 转自:北京日报客户端记者16日从市场监管总局获悉,市场监管总局正抓紧推进《互联网平台反垄断合规指引》...
天奇股份:锂电循环业务夯实产业... 12月16日,江西天奇金泰阁集团(简称“天奇金泰阁”)资本赋能发展大会在江西龙南举行。会上,天奇股份...
「侠客岛」他们用上了“AI分身...   炒股就看金麒麟分析师研报,权威,专业,及时,全面,助您挖掘潜力主题机会! (来源:海外网)来源...