快速排序算法-例题:洛谷P1271【深基9.例1】选举学生会

本文详细介绍了快速排序算法,包括其基本思想(选取基准划分区间),递归过程,以及其优点(高效率,O(nlogn)时间复杂度)和缺点(不稳定性和最差情况下的时间复杂度)。还提供了C++代码示例,用于对学生会选票进行排序。
摘要由CSDN通过智能技术生成

快速排序算法

  1. 快排思想
    基本思想就是选取一个基准,一趟排序确定两个区间,一个区间全部比基准值小,另一个区间全部比基准值大,接着再选取一个基准值来进行排序,以此类推,最后得到一个有序的数列。简单来说就是将一段数据分为两个部分,随机选取一个数,分区间不断地去比较大小
  2. 快速上手:快速排序算法分解
    1.随机挑选一个数确定分界点,这里取x,也就是第一个数
    2.调整数据,使得左边的数小于x,右边的数大于x,这里推荐swap函数
    3.采用递归,左右两边分别写出递归函数
  3. 快排图c2758518208944a089797cde23e12bf6.png
  4. 快排优缺点
    优点在于效率较高,最好情况下的时间复杂度为 O (nlog n) ,执行过程中不需要额外存储空间,而且对cache比较友好。 快排也有一些缺点:它是不稳定的,对于数据中大小相同的元素,他们在快排之后的相对位置可能会发生改变;它无法保证其时间复杂度为 O (nlog n) ,在最差情况下其时间复杂度为 O (n^2) 。
  5. 代码分析
void quick_sort(int q[], int l, int r)
{
    if (l >= r) return;
    int i = l - 1, j = r + 1, x = q[1];
    while (i < `j)`
    {
        do i ++ ; while (q[i] < x);
        do j -- ; while (q[j] > x);
        if (i < j) swap(q[i], q[j]);
    }
    quick_sort(q, l, j), quick_sort(q, j + 1, r);
}

    6.例题分析
#题目描述
学校正在选举学生会成员,有 n(n≤999)名候选人,每名候选人编号分别从 1 到 n,现在收集到了 m(m≤2000000)张选票,每张选票都写了一个候选人编号。现在想把这些堆积如山的选票按照投票数字从小到大排序。
输入格式
输入 n 和 m 以及 m 个选票上的数字。
输出格式
求出排序后的选票编号。
输入输出样例
输入
5 10
2 5 2 2 5 2 2 2 1 2
输出
1 2 2 2 2 2 2 2 5 5
题解:

#include<iostream>
using namespace std;
void quick_sort(int a[],int l,int r)
{
if(l>=r) return;
int x=a[l];int i=l-1;int 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]);
}
quick_sort(a,l,j);
quick_sort(a,j+1,r);
}
int main()
{int n,m;
scanf("%d",&n);//比cin更快
scanf("%d",&m);
int a[2000000];
for(int i=0;i<m;i++)
scanf("%d",&a[i]);
quick_sort(a,0,m-1);
for(int i=0;i<m;i++)
cout<<a[i]<<" ";
}

  • 13
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值