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