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

原题链接: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])

重复以上过程,直到ij相遇。

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

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;
}

 

posted @ 2024-01-26 23:22  五月江城  阅读(109)  评论(0编辑  收藏  举报