【0基础学算法】快速排序(超详细讲解+私人笔记+源码)下

简介: 笔记

第一题:快速排序


这个题目很简单就是对一段长为n的数组,对其进行从小到大的排序后并输出以可。


输入格式:


输入共两行,第一行包含整数 n。        第二行包含 数列中的n 个整数。


输出格式:


输出排序后的结果


数据范围:


1≤n≤1000001≤n≤100000


输入样例:

5
7 2 3 8 10


输出样例:

2 3 7 8 10


讲解:


这就是一个经典的快速排序题,当然你也可以用其他方法,不过我们今天学习的是快排,那就希望大家可以使用快速排序写,这个题目目的很明确,就是进行排序就行,所以我们就在主函数中对他需要的数字进行输入,然后调用我们之前所说的模板就行,大家可以先自己尝试以下,如果解决不了就看一下我下面的AC代码,代码也有讲解,希望你看过之后可以知道为啥自己没写出来的原因。


AC代码:  

#include <iostream>
using namespace std ;
const int N = 100010 ;
int a[N] ;
void quick_sort(int a[], int l, int r)
{
    if(l>=r)    return ;  //数组中所含元素为一个或零个时返回 
    int i = l-1 ;  
    int j = r+1 ;
    int x = a[l+r>>1] ;
    /*
  这里对左边下标减一以及右边下标加一是为了后面do while语句的执行
      因为刚开始都要i++ j-- 所以我们在开始定义的时候就直接先减去,
    等后面第一步i++ j--时正好可以从左右两端坐标开始 也不耽误循环的进行 
    */
    while(i<j)    //两指针相遇就退出循环 
    {
        do  i++ ;
        while(a[i] < x) ; //指针的移动 
        do j-- ;
        while(a[j] > x) ; //指针的移动 
        if(i<j) swap(a[i], a[j]) ;  //交换 
    }
    quick_sort(a, l, j) ; //递归进行 
    quick_sort(a, j+1, r) ;
}
int main()
{
  //按照题目输入 
    int n ;
    cin >> n ;
    for(int i=0 ; i<n; i++)
    {
        cin >> a[i] ;
    }
    quick_sort(a, 0, n-1) ; //调用模板 
    for(int i=0; i<n; i++)
    {
        cout << a[i] << " " ;
    }
    return 0 ;
}


第二题:求第 k 小的数


题目描述

输入 n(1 <= n < 5000000)个数字 ai(1 <= ai < 10^9),输出这些数字的第 k 小的数。最小的数是第 0 小。

输入格式

输出格式

样例

样例输入

5 1
4 3 2 1 5


样例输出

2

讲解:

这个题就是一个小变式了,其实百变不离其总,也是要先对其进行排序,然后从前往后寻找就可以啦。

AC代码:

#include <iostream>
using namespace std ;
const int N = 5000010 ;
int a[N] ;
void quick_sort(int a[], int l, int r)
{
  int x = a[l+r>>1] ;
  int i = l-1 ;
  int j = r+1 ;
  if(l>=r)  return ;
  while(i<j)
  {
    do i++ ;
    while(x>a[i]) ;
    do j-- ;
    while(x<a[j]) ;
    if(i<j) swap(a[i],a[j]) ;
  }
  quick_sort(a,l,j) ;
  quick_sort(a,j+1,r) ;
}
int main()
{
  int n, k ;
  cin >> n >> k ;
  for(int i=0; i<n; i++)
  {
    cin >> a[i] ;
  }
  quick_sort(a, 0, n-1) ;
  cout << a[k] << endl ;
  return 0 ;
 }


显而易见,这个代码也就是第一题代码的一个小变形,把输出变一下就行,所以就不做讲解了。


结尾


好的,到这里我们今天的算法学习就到了尾声,不过大家以后一点要多复习,不让会遗忘的而且模板也要多敲几遍,加深自己的印象。




相关文章
|
14天前
|
搜索推荐 C语言
【排序算法】快速排序升级版--三路快排详解 + 实现(c语言)
本文介绍了快速排序的升级版——三路快排。传统快速排序在处理大量相同元素时效率较低,而三路快排通过将数组分为三部分(小于、等于、大于基准值)来优化这一问题。文章详细讲解了三路快排的实现步骤,并提供了完整的代码示例。
41 4
|
15天前
|
搜索推荐 算法 C语言
【排序算法】八大排序(上)(c语言实现)(附源码)
本文介绍了四种常见的排序算法:冒泡排序、选择排序、插入排序和希尔排序。通过具体的代码实现和测试数据,详细解释了每种算法的工作原理和性能特点。冒泡排序通过不断交换相邻元素来排序,选择排序通过选择最小元素进行交换,插入排序通过逐步插入元素到已排序部分,而希尔排序则是插入排序的改进版,通过预排序使数据更接近有序,从而提高效率。文章最后总结了这四种算法的空间和时间复杂度,以及它们的稳定性。
62 8
|
15天前
|
搜索推荐 算法 C语言
【排序算法】八大排序(下)(c语言实现)(附源码)
本文继续学习并实现了八大排序算法中的后四种:堆排序、快速排序、归并排序和计数排序。详细介绍了每种排序算法的原理、步骤和代码实现,并通过测试数据展示了它们的性能表现。堆排序利用堆的特性进行排序,快速排序通过递归和多种划分方法实现高效排序,归并排序通过分治法将问题分解后再合并,计数排序则通过统计每个元素的出现次数实现非比较排序。最后,文章还对比了这些排序算法在处理一百万个整形数据时的运行时间,帮助读者了解不同算法的优劣。
51 7
|
1月前
|
算法 API 计算机视觉
人脸识别笔记(一):通过yuface调包(参数量54K更快更小更准的算法) 来实现人脸识别
本文介绍了YuNet系列人脸检测算法的优化和使用,包括YuNet-s和YuNet-n,以及通过yuface库和onnx在不同场景下实现人脸检测的方法。
52 1
|
1月前
|
JSON 算法 数据可视化
测试专项笔记(一): 通过算法能力接口返回的检测结果完成相关指标的计算(目标检测)
这篇文章是关于如何通过算法接口返回的目标检测结果来计算性能指标的笔记。它涵盖了任务描述、指标分析(包括TP、FP、FN、TN、精准率和召回率),接口处理,数据集处理,以及如何使用实用工具进行文件操作和数据可视化。文章还提供了一些Python代码示例,用于处理图像文件、转换数据格式以及计算目标检测的性能指标。
67 0
测试专项笔记(一): 通过算法能力接口返回的检测结果完成相关指标的计算(目标检测)
|
1月前
|
算法
❤️算法笔记❤️-(每日一刷-160、相交链表)
❤️算法笔记❤️-(每日一刷-160、相交链表)
18 1
|
1月前
|
数据可视化 搜索推荐 Python
Leecode 刷题笔记之可视化六大排序算法:冒泡、快速、归并、插入、选择、桶排序
这篇文章是关于LeetCode刷题笔记,主要介绍了六大排序算法(冒泡、快速、归并、插入、选择、桶排序)的Python实现及其可视化过程。
14 0
|
1月前
|
算法
❤️算法笔记❤️-(每日一刷-83、删除排序链表中的重复项)
❤️算法笔记❤️-(每日一刷-83、删除排序链表中的重复项)
32 0
|
1月前
|
算法
❤️算法笔记❤️-(每日一刷-26、删除有序数组的重复项)
❤️算法笔记❤️-(每日一刷-26、删除有序数组的重复项)
23 0
|
30天前
|
算法 安全 数据安全/隐私保护
基于game-based算法的动态频谱访问matlab仿真
本算法展示了在认知无线电网络中,通过游戏理论优化动态频谱访问,提高频谱利用率和物理层安全性。程序运行效果包括负载因子、传输功率、信噪比对用户效用和保密率的影响分析。软件版本:Matlab 2022a。完整代码包含详细中文注释和操作视频。
下一篇
无影云桌面