首页 > 其他分享 >快速排序模板及快速选择例题

快速排序模板及快速选择例题

时间:2022-10-08 09:36:29浏览次数:46  
标签:排序 int 整数 while 例题 快速 模板 指针

快速排序模板及快速选择例题

快速排序

思路

  1. 首先选择出分界值,x = q[l]或q[r]或 q[(l +r) / 2];

  2. 将整个数组分为左右两段,使得左边的所有数都 <= x,右边的所有数都 >= x

    2.1 将两个指针i, j分别指向数组的两端, 即i = l - 1; j = r + 1;

    2.2 先将i指针向右移动,如果q[i]的值<x,则i继续移动;如果q[i]的值 >= x ,则停止移动;

    2.3 将j指针向左移动,如果q[j]的值>x,则i继续移动;如果q[j]的值 <= x ,则停止移动;

    2.4 当两个指针都停止时,则两个指针的值互换位置;

    2.5然后继续重复2.2,2.3,2.4 直至i指针与j指针重合,或者i指针到了j指针的右边,停止移动

  3. 最后分别递归左右两个数组。


代码如下:

#include <iostream>

using namespace std;

const int N = 1e6 + 10;



int n;
int q[N];

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

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

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

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

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

    kuaipai(q, 0, n - 1);

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

    return 0;
}



快速选择排序

给定一个长度为 nn 的整数数列,以及一个整数 kk,请用快速选择算法求出数列从小到大排序后的第 kk 个数。

输入格式

第一行包含两个整数 nn 和 kk。

第二行包含 nn 个整数(所有整数均在 1∼1091∼109 范围内),表示整数数列。

输出格式

输出一个整数,表示数列的第 kk 小数。

数据范围

1≤n≤1000001≤n≤100000,
1≤k≤n1≤k≤n

输入样例:

5 3
2 4 1 5 3

输出样例:

3

解题思路:

  1. 首先将该数列进行快速排序
  2. 然后判断左边的个数left与k的大小
  3. 如果left大于k 则直接输出第k个值
  4. 如果left小于k ,则输出k - left

代码如下

#include <iostream>

using namespace std;

const int N = 100010;

int n, k;
int q[N];

int kuaixuan(int q[], int l, int r, int k){
    
    if(l == r) return q[l];
    
    int x = q[(l + r) / 2], i = l -1, j = 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]);
    }
    
    
    
    int sl = j - l + 1;
    if(k <= sl) return kuaixuan(q, l, j , k);
    else return kuaixuan(q, j + 1, r, k - sl);
}

int main(){
    int n, k;
    
    scanf("%d%d", &n, &k);
    
    for(int i = 0; i < n; i++) scanf("%d", &q[i]);
    
    cout << kuaixuan(q, 0, n - 1, k) << endl;
    
    return 0;
}

标签:排序,int,整数,while,例题,快速,模板,指针
From: https://www.cnblogs.com/xiaofenga/p/16767962.html

相关文章

  • LuoguP3377 【模板】左偏树(可并堆)
    题意如题,一开始有\(n\)个小根堆,每个堆包含且仅包含一个数。接下来需要支持两种操作:1xy:将第\(x\)个数和第\(y\)个数所在的小根堆合并(若第\(x\)或第\(y\)个......
  • datax Steam模板
    ./datax.py-rstreamreader-wstreamwriter仅限于Steam方式{"job":{"content":[{"reader":{......
  • 脚本模板
    必不可少的Linux运维脚本!!!公子 Cloud研习社 2022-09-2107:31 发表于山东收录于合集#实战经验51个#linux89个#云计算57个#shell34个#计算机59个 一......
  • 前端三剑客快速入门(三)
    前言前端三剑客快速入门(一)前端三剑客快速入门(二)书接上文,重新排版了。CSSCSS定位基本属性:<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8">......
  • 快速失败、非bean入参校验
    快速失败publicclassValidationUtil{//线程安全privatestaticValidatorfailFastValidator;static{validator=Validation.buildDefa......
  • 一款快速直观比较图片的神器
    某天,领导让小驰拿几款友商的手机,去附近商场溜达下,顺带拍些对比样张回来。上班遇上这等差事,真是美哉。小驰很开心的约上个小伙伴,揣着几台手机开开心心的出去溜达了~逛了商场,......
  • 快速理解memset
    memset函数是在头文件:cstring 或 memory中 memset函数的作用是将数字以单个字节逐个拷贝的方式放到指定的内存中去memset(a,0,sizeofa);int类型的变量一般占......
  • P3919 【模板】可持久化线段树 1(可持久化数组)
    还是用主席树来做(因为提到不同的版本),这时候的主席树不是以权值为下标的,就是普通的线段树,维护范围1~n,i存的是a[]中的数。1#include<bits/stdc++.h>2usingnamespac......
  • 如何快速在团队内做一次技术分享?
    前言相信很多小伙伴跟我一样,是一位奋斗在一线的业务开发,每天有做不完的任务,还有项目经理在你耳边催你,“这个功能今天能完成吗?”其实作为一名前端工程师,任务就是完成Leader......
  • Miller-Rabin快速素性判断
    利用二次探测定理和费马小定理二次探测定理:\(x^2\equiv1(mod\;p)\)\(p\)是奇素数当且仅当$x\equiv1$或者\(x\equiv-1\)我们结合费马小定理,对于将要......