首页 > 其他分享 >洛谷题单指南-排序-P1177 【模板】排序

洛谷题单指南-排序-P1177 【模板】排序

时间:2024-01-26 23:35:15浏览次数:33  
标签:int 洛谷题 quicksort P1177 while 数组 排序

原题链接:https://www.luogu.com.cn/problem/P1177

题意解读:数据量为100000,必须用小于等于N*logN复杂度的排序算法,可以直接用sort,更重要需要掌握快速排序的过程。

知识点:快速排序

设定数组q[n],l,r

第一步:确定分界点x

可以取q[l]、q[(l+r) / 2]、q[r]三种

第二步:调整区间

把<=x的数调整到左边区间,>=x的数调整到右边区间

第三步:递归处理

难点主要在第二步,有两种方法:

方法一:空间换时间

开两个数组a[],b[],遍历q[],将<=x的放到a数组,将>=x的放到b数组,然后依次遍历a、b数组把数填到q数组

方法二:头尾指针

定义两个下标i,j,指向数组头、尾,

q[i]如果<x,i一直++,直到遇到q[i]>=x

q[j]如果>x,j一直--,直到遇到q[j]<=x

然后swap(q[i], q[j])

重复以上过程,直到i、j相遇。

快速排序的代码有多种方式,下面给出一种比较简化的版本。

100分代码:

#include <bits/stdc++.h>
using namespace std;

const int N = 100005;

int a[N];
int n;

void quicksort(int l, int r)
{
    if(l >= r) return;

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

int main()
{
    cin >> n;
    for(int i = 1; i <= n; i++) cin >> a[i];
    //sort(a + 1, a + n + 1);
    quicksort(1, n);
    for(int i = 1; i <= n; i++)
    {
        if(i > 1) cout << " ";
        cout << a[i];
    } 
    return 0;
}

 

标签:int,洛谷题,quicksort,P1177,while,数组,排序
From: https://www.cnblogs.com/jcwy/p/17990943

相关文章

  • 【板子】冒泡/选择/插入 排序
    #include<bits/stdc++.h>usingnamespacestd;#defineN101inta[N];voidsort_mp(){for(inti=1;i<100;i++){for(intj=1;j<100;j++){if(a[j]>a[j+1]){swap(a[j],a[j+1]);......
  • 【板子】快速排序
    #include<bits/stdc++.h>usingnamespacestd;inta[114514];voidQuicksort(intl,intr);intmain(){freopen("working.in","r",stdin);freopen("working.out","w",stdout);intn;cin>>n;......
  • 【板子】归并排序
    #include<bits/stdc++.h>usingnamespacestd;constintN=1e6+6;intn;inta[N];intb[N];voidMergesort(intl,intr);longlongcnt;intmain(){freopen("working.in","r",stdin);freopen("working.out",&......
  • 拓扑排序
    讲解  例题  第1题   拓扑序列对下图所示的有向图进行拓扑排序,得到的拓扑序列可能是() 第2题   拓扑序列_以下关于拓扑排序的说法中,错误的是()。 若某有向图存在环路,则该有向图一定不存在拓扑排序在拓扑排序算法中为暂存入度为零的顶点,可......
  • 洛谷题解-P2712 摄像头
    https://www.luogu.com.cn/problem/P2712可以看出是拓扑排序,因为是有前后关系的,但是坑点在于点并不连续,值得记录一下(刚开始70分,后来才AC)注意坑点:拓扑排序,遍历的点不连续 #include<bits/stdc++.h>usingnamespacestd;constintN=1e5+5;intn,x,m,y,d[N],cnt=0,v......
  • 拓扑排序模板
    给定一个DAG(有向无环图),如果从\(u\)到\(v\)有边,则认为\(v\)依赖于\(u\)。如果\(u\)到\(v\)有路径(\(u\)可达\(v\)),则称\(v\)间接依赖于\(u\)。我们将图中的顶点以线性方式进行排序,使得对于任何的顶点\(u\)到\(v\)的有向边\((u,v)\),都可以有\(u\)在\(v\)的......
  • 洛谷题单指南-排序-P1271 【深基9.例1】选举学生会
    原题链接:https://www.luogu.com.cn/problem/P1271题意解读:最直接的计数排序问题,借助一个桶h[N],对被投票的候选人x执行h[x]++,再按顺序遍历输出即可。100分代码:#include<bits/stdc++.h>usingnamespacestd;constintN=1005;inth[N];intmain(){intn,m;......
  • 排序
    排序1.快速排序#include<bits/stdc++.h>usingnamespacestd;intn;inta[100001];voidqsort(intl,intr){if(l>=r)return;inti=l,j=r,x=a[l];while(i<j){ while(i<j&&a[j]>=x)j--;//从右向左找第一个小于x的数if(i&l......
  • MySQL SQL点查,范围查,排序,分组的Explain分析和SQL优化(8.0版本)
    MySQLSQL常用优化主要有where,range,order,groupby,or等查询。下图是优化的原则,后面会有一个例子来看看:比如建立了联合索引(c1,c2,c3),索引长度分别为5,5,4。数据有50条:点查SELECT*FROMtraining.t1wherec3=1andc2=1andc1=1;使用了索引,只要全部包含索引列,那么点查顺序......
  • 洛谷题单指南-模拟和高精度-P1045 [NOIP2003 普及组] 麦森数
    原题链接:https://www.luogu.com.cn/problem/P1045题意解读:要计算2p-1的位数和最后500位,实际上只需要计算2p,两者位数一致,前者比后者个位减1即可,且个位肯定不会是0,比较容易处理。解题思路:如果直接采用高精度乘法计算2p,p最大3.1*106,高精度所用数组最长大概9*105,一共最多计算3.......