【洛谷 P1177】【模板】快速排序 题解(快速排序+指针)

简介: **快速排序模板题解**- **任务**:对输入的N个整数进行排序。- **算法**:使用快速排序,避免使用C++的STL`sort`。- **输入**:一行包含N(N≤10^5),第二行是N个不超过10^9的整数。- **输出**:排序后的整数序列,空格分隔。- **样例**:输入`5 4 2 4 5 1`,输出`1 2 4 4 5`。- **提示**:20%的数据,N≤10^3;所有数据,N≤10^5。- **代码**:定义`partition`函数划分数组,主函数`main`读取数据,调用`quickSort`排序,然后打印结果。

【模板】快速排序

题目描述

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

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

输入格式

第 $1$ 行为一个正整数 $N$,第 $2$ 行包含 $N$ 个空格隔开的正整数 $a_i$,为你需要进行排序的数,数据保证了 $a_i$ 不超过 $10^9$。

输出格式

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

样例 #1

样例输入 #1

5
4 2 4 5 1

样例输出 #1

1 2 4 4 5

提示

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

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

思路

快速排序。数据过大,需要打开O2优化。

AC代码

#include <iostream>
#include <cstdio>
#define AUTHOR "HEX9CF"
using namespace std;

const int maxn = 100005;
int n;

void read(int &x){
   
    x = 0;
    char ch;
    while (('0' > ch || '9' < ch))
    {
   
        ch = getchar();
    }
    while (!('0' > ch || '9' < ch))
    {
   
        x = x * 10 + ch - '0';
        ch = getchar();
    }
}

int* partition(int a[], int *low, int *high){
   
    int *i = low;
    int *j = high;
    int pivot = *low;
    while(i < j){
   
        // 右指针大于基准值,向左移动
        while(i < j && *j > pivot){
   
            j--;
        }
        // 左指针大于基准值,向右移动
        while(i < j && *i <= pivot){
   
            i++;
        }
        // 交换左右指针的值
        if(i < j){
   
            swap(*(i++), *(j--));
        }
    }
    // 左指针和基准值比较
    if(*i > pivot){
   
        // i - 1处为基准值
        swap(*(i - 1), *low);
        return i - 1;
    }else{
   
        // i处为基准值
        swap(*i, *low);
        return i;
    }
}

void quickSort(int a[], int *low, int *high){
   
    if(low < high){
   
        int *mid = partition(a, low, high);
        quickSort(a, low, mid - 1);
        quickSort(a, mid + 1, high);
    }
}

int main() {
   
    int arr[maxn];
    read(n);
    for(int i = 0; i < n; i++){
   
        int in;
        read(arr[i]);
    }
    quickSort(arr, arr, arr + n - 1);
    for(int i = 0; i < n; i++){
   
        printf("%d ", arr[i]);
    }
    return 0;
}
目录
相关文章
|
2月前
|
搜索推荐 C语言 C++
【C语言】指针篇-精通库中的快速排序算法:巧妙掌握技巧(4/5)
【C语言】指针篇-精通库中的快速排序算法:巧妙掌握技巧(4/5)
|
6月前
|
存储 Java C#
C++语言模板类对原生指针的封装与模拟
C++|智能指针的智能性和指针性:模板类对原生指针的封装与模拟
|
7月前
|
搜索推荐 算法 索引
【排序算法】深入解析快速排序(霍尔法&&三指针法&&挖坑法&&优化随机选key&&中位数法&&小区间法&&非递归版本)
【排序算法】深入解析快速排序(霍尔法&&三指针法&&挖坑法&&优化随机选key&&中位数法&&小区间法&&非递归版本)
174 4
|
存储 算法 安全
04-📝C++核心语法|面向对象2【友元、内部类与局部类、强化训练(数组类封装)、运算符重载、仿函数、模板、类型转换、 C++标准、错误&&异常、智能指针】
复习`C++核心语法`,且适当进行汇编探索底层实现原理,进一步夯实基础,为以后的`底层开发`、`音视频开发`、`跨平台开发`、`算法`等方向的进一步学习埋下伏笔。
04-📝C++核心语法|面向对象2【友元、内部类与局部类、强化训练(数组类封装)、运算符重载、仿函数、模板、类型转换、 C++标准、错误&&异常、智能指针】
|
7月前
|
存储
【挖坑&前后指针版】快速排序(3)
【挖坑&前后指针版】快速排序(3)
34 0
|
搜索推荐
[数据结构 -- 手撕排序算法第六篇] 递归实现快速排序(集霍尔版本,挖坑法,前后指针法为一篇的实现方法,很能打)2
[数据结构 -- 手撕排序算法第六篇] 递归实现快速排序(集霍尔版本,挖坑法,前后指针法为一篇的实现方法,很能打)2
|
搜索推荐
[数据结构 -- 手撕排序算法第六篇] 递归实现快速排序(集霍尔版本,挖坑法,前后指针法为一篇的实现方法,很能打)1
[数据结构 -- 手撕排序算法第六篇] 递归实现快速排序(集霍尔版本,挖坑法,前后指针法为一篇的实现方法,很能打)1
|
算法 程序员
双指针算法模板及练习
双指针算法模板及练习
80 1
快速排序3(前后指针法)
快速排序3(前后指针法)
120 0
|
算法 搜索推荐 C语言
C语言实现快速排序(hoare法、挖坑法、前后指针法与非递归实现)
C语言实现快速排序(hoare法、挖坑法、前后指针法与非递归实现)
234 0