讨论 / 跟这道题无关,只是问一下
Alexxuhaoran 2018-05-03 05:42:42
点我顶贴 收藏 删除
快排哪错了?

#include<iostream>

#include<cstdio>

using namespace std;

int Ederson(int *m,int *g)

{

int x;

x=*m;

*m=*g;

*g=x;

}

int a[100001];

void qsort(int l,int r)

{

int x,p,q;

x=(r+1)/2;

p=l;

q=r;

while(p<=q)

{

while(a[p]<=x)

{

p++;

}

while(a[q]>=x)

{

q--;

}

if(p<=q)

{

Ederson(&a[p],&a[q]);

}

}

if(p>l)

{

qsort(l,p);

}

if(q<r)

{

qsort(q,r);

}

}

int main()

{

int n,i;

cin>>n;

for(i=1;i<=n;i++)

cin>>a[i];

qsort(1,n);

for(i=1;i<=n;i++)

cout<<a[i]<<' ';

return 0;

}

#1 青丘杨哲@2018-05-03 17:03:49
回复 删除
你用STL的sort不行吗
#2 青丘杨哲@2018-05-03 17:04:35
回复 删除
sort(a+0,a+n,cmp),cmp是自己的比较函数
#3 青丘杨哲@2018-05-03 17:04:50
回复 删除
如果省略cmp默认从小到大排
#4 青丘杨哲@2018-05-03 17:05:07
回复 删除
如果要稳定性的话stable_sort(a+0,a+n,cmp)
#5 青丘杨哲@2018-05-03 17:05:37
回复 删除
在开放STL的年代,自己写qsort似乎有点……
#6 青丘杨哲@2018-05-03 17:05:59
回复 删除
#include<bits/stdc++.h>

using namespace std;

int s[10001],n;

void qsort(int l,int r)

{

int i=l,j=r,mid=s[(l+r)/2];

do

{

while (s[i]<mid) i++;

while (s[j]>mid) j--;

if (i<=j) swap(s[i],s[j]),i++,j--;

}while (i<=j);

if (l<j) qsort(l,j);

if (i<r) qsort(i,r);

}

int main()

{

cin>>n;

for (int i=0;i<n;i++) cin>>s[i];

qsort(0,n-1);

for (int i=0;i<n;i++) cout<<s[i]<<" ";

return 0;

}

#7 青丘杨哲@2018-05-03 17:11:00
回复 删除
STL标程
#8 青丘杨哲@2018-05-03 17:11:12
回复 删除
#include<bits/stdc++.h>

using namespace std;

int n,s[1001],sum;

int main()

{

cin>>n;

for (int i=0;i<n;i++)

{

cin>>s[i];

}

sort(s,s+n);

sum=unique(s,s+n)-s;

cout<<sum<<endl;

for (int i=0;i<sum;i++)

{

cout<<s[i]<<" ";

}

return 0;

}

#9 Alexxuhaoran@2018-05-05 23:11:39
回复 删除
回复 #8 青丘杨哲:谢谢

#10 Alexxuhaoran@2018-05-05 23:12:10
回复 删除
回复 #8 青丘杨哲:初学者,还在上小学,不懂那么多
查看更多回复
提交回复