【洛谷 P1177】【模板】快速排序 题解(快速排序+数组索引)

简介: **快速排序模板题目**,要求使用快排算法对输入的整数序列进行排序。输入包含正整数N和N个整数,输出排序后的序列。20%的数据N≤10^3,所有数据N≤10^5。代码中提供了一种实现,包括读取输入、定义partition函数划分数组、递归调用quickSort及主函数执行排序和输出。注意C++选手避免使用STL的`sort`。

【模板】快速排序

题目描述

利用快速排序算法将读入的 $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>
#define AUTHOR "HEX9CF"
using namespace std;

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, j = high, pivot = a[low];
    while (i < j)
    {
   
        while (i < j && a[j] > pivot) // 向左扫描
        {
   
            j--;
        }
        while (i < j && a[i] <= pivot) // 向右扫描
        {
   
            i++;
        }
        if (i < j)
        {
   
            swap(a[i++], a[j--]);
        }
    }
    if (a[i] > pivot)
    {
   
        swap(a[i - 1], a[low]);
        return i - 1;
    }
    else
    {
   
        swap(a[i], a[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 n;

int main()
{
   
    read(n);
    int *arr = new int[n];
    for (int i = 0; i < n; i++)
    {
   
        read(arr[i]);
    }
    quickSort(arr, 0, n - 1);
    for (int i = 0; i < n; i++)
    {
   
        cout << arr[i] << " ";
    }
    delete[] arr;
    return 0;
}
目录
相关文章
快排&超详细,Leetcode排序数组题目带你升华掌握(上)
快排&超详细,Leetcode排序数组题目带你升华掌握
79 0
|
9月前
|
机器学习/深度学习 搜索推荐 算法
【洛谷 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`排序,然后打印结果。
34 0
|
9月前
|
存储 算法 数据挖掘
LeetCode 题目 88:双指针\直接\递归\插入排序\归并排序 实现合并两个有序数组
LeetCode 题目 88:双指针\直接\递归\插入排序\归并排序 实现合并两个有序数组
|
10月前
|
人工智能 供应链 搜索推荐
①归并排序、快速排序 、堆排序、计数排序[算法、代码模板、面试题]
①归并排序、快速排序 、堆排序、计数排序[算法、代码模板、面试题]
115 0
|
测试技术 编译器 Shell
快排&超详细,Leetcode排序数组题目带你升华掌握(下)
快排&超详细,Leetcode排序数组题目带你升华掌握(上)
164 0
|
算法 搜索推荐 C语言
用C语言对学生成绩进行排序(归并排序和基数排序)
本文主要是使用C语言对学生成绩进行排序,使用的排序算法是归并排序和基数排序,含源码!
307 1
用C语言对学生成绩进行排序(归并排序和基数排序)
|
存储 搜索推荐 算法
七大排序 (9000字详解直接插入排序,希尔排序,选择排序,堆排序,冒泡排序,快速排序,归并排序)
七大排序 (9000字详解直接插入排序,希尔排序,选择排序,堆排序,冒泡排序,快速排序,归并排序)
102 0
|
机器学习/深度学习 人工智能 搜索推荐
P1177 【模板】快速排序(二分排序)
P1177 【模板】快速排序(二分排序)
93 0
|
搜索推荐 Java 数据处理
【JavaSE专栏31】数组排序的三剑客:冒泡排序、选择排序和插入排序
【JavaSE专栏31】数组排序的三剑客:冒泡排序、选择排序和插入排序
111 0
|
存储 搜索推荐 测试技术
数据结构__<八大排序> __插入排序 |希尔排序 |选择排序 |堆排序 |快速排序 |归并排序(C语言实现)
数据结构__<八大排序> __插入排序 |希尔排序 |选择排序 |堆排序 |快速排序 |归并排序(C语言实现)
296 0

热门文章

最新文章