快速排序
快速排序
时间限制(普通/Java) : 1000 MS/ 3000 MS 运行内存限制 : 65536 KByte
总提交 : 1600 测试通过 : 605
比赛描述
给定输入排序元素数目n和相应的n个元素,写出程序,利用内排序算法中快速排序算法进行排序,并输出排序最后结果的相应序列。输入
共两行,第一行给出排序元素数目n,第二行给出n个元素,1≤n≤100000,每个元素值范围为 [0,100000)
输出
一行,输出排序结果。
样例输入
7
48 36 68 72 12 48 2样例输出
2 12 36 48 48 68 72
快速排序:快速排序采用的思想是分治思想。
快速排序是找出一个元素(理论上可以随便找一个)作为基准(pivot),然后对数组进行分区操作,使基准左边元素的值都不大于基准值,基准右边的元素值 都不小于基准值,如此作为基准的元素调整到排序后的正确位置。递归快速排序,将其他n-1个元素也调整到排序后的正确位置。最后每个元素都是在排序后的正 确位置,排序完成。所以快速排序算法的核心算法是分区操作,即如何调整基准的位置以及调整返回基准的最终位置以便分治递归。
核心代码:
void quick_sort(int a[],int l,int r)
{
if(l>=r)
return;
int i=l,j=r;
int tmp=a[i];
while(i<j)
{
while(i<j && a[j]>=tmp)// 从右向左找小于x的数来填a[i]
--j;
a[i] = a[j];//将a[j]填到a[i]中,a[j]就形成了一个新的坑
while(i<j && a[i]<=tmp)// 从左向右找大于或等于x的数来填a[j]
++i;
a[j] = a[i];//将a[i]填到a[j]中,a[i]就形成了一个新的坑
}
a[i] = tmp;//退出时,i等于j。将x填到这个坑中
quick_sort(a,l,i-1);// 递归调用
quick_sort(a,j+1,r);
}
AC代码:
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;
ll arr[100000];
ll n;
void quick_sort(ll a[],ll l,ll r){
if(l>=r)
return;
ll i=l,j=r;
ll k=a[i];
while(i<j){
while(i<j && a[j]>=k)
--j;
a[i] = a[j];
while(i<j && a[i]<=k)
++i;
a[j] = a[i];
}
a[i] = k;
quick_sort(a,l,i-1);
quick_sort(a,i+1,r);
}
int main()
{
cin>>n;
for(ll i=0;i<n;i++)
{
cin>>arr[i];
}
quick_sort(arr,0,n-1);
for(ll i=0;i<n;i++)
{
if(i!=n-1)
cout<<arr[i]<<" ";
else cout<<arr[i];
}
cout<<endl;
return 0;
}