【洛谷 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排序数组题目带你升华掌握
56 0
|
5月前
|
机器学习/深度学习 搜索推荐 算法
【洛谷 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`排序,然后打印结果。
20 0
|
5月前
|
存储 算法 数据挖掘
LeetCode 题目 88:双指针\直接\递归\插入排序\归并排序 实现合并两个有序数组
LeetCode 题目 88:双指针\直接\递归\插入排序\归并排序 实现合并两个有序数组
|
测试技术 编译器 Shell
快排&超详细,Leetcode排序数组题目带你升华掌握(下)
快排&超详细,Leetcode排序数组题目带你升华掌握(上)
135 0
|
机器学习/深度学习 人工智能 搜索推荐
P1177 【模板】快速排序(二分排序)
P1177 【模板】快速排序(二分排序)
80 0
|
算法 测试技术 API
【二分查找】二分查找算法练习题
【二分查找】二分查找算法练习题
|
人工智能 算法
【数据结构与算法】数组2:双指针法 & 二分法(螺旋矩阵)
【数据结构与算法】数组2:双指针法 & 二分法(螺旋矩阵)
96 0
|
存储 算法 搜索推荐
LeetCode:215. 数组中的第K个最大元素——快速排序
题目描述:给定整数数组nums和整数** k**,请返回数组中第 k 个最大的元素。 请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。你必须设计并实现时间复杂度为 O(n) 的算法解决此问题。
|
Serverless
LeetCode每日一题题解:540. 有序数组中的单一元素
LeetCode每日一题题解:540. 有序数组中的单一元素