大部分排序用冒泡可以解决,但是在冒泡排序中双层for循环所有的循环次数不能超过10的8次方,以此运用快排法可较快的解决问题;
以100000个数为例
for(i=1;i<=100000-2;i++)
for(j=1;j<=100000-2-i;j++)
{
.......;
}
共需要循环100000*100000次 所以肯定超时;
找女朋友
Time Limit: 15MS Memory limit: 65536K
题目描述
输入
输出
示例输入
5 1 3 2 5 4
示例输出
5 4 3 2 1
快排法
#include<stdio.h> #include<stdlib.h> #define MAX 10000001 int a[MAX];
void px(int l,int r); int qp(int l,int r); int main() { int i,n;
scanf("%d",&n); for(i=1;i<=n;i++) { scanf("%d",&a[i]); } px(1,n); for(i=n;i>=1;i--) { printf("%d",a[i]); if(i!=1)printf(" "); else printf("\n"); } return 0; } void px(int l,int r) { if(l>=r)return 0; int mid=qp(l,r); px(l,mid-1); px(mid+1,r); } int qp(int l,int r) { int bj=a[l]; while(l<r) { while(bj<=a[r]&&l<r) { r--; } a[l]=a[r]; while(bj>=a[l]&&l<r) { l++; } a[r]=a[l];
} a[r]=bj; return r; }
#include<stdio.h>
int a[1100001];
int c[1100001];
void hebing(int l,int r,int ll,int rr)
{
int i=l;
int j=ll;
int k=l;
for(i,j,k;i<=r&&j<=rr;)
{
if(a[i]<a[j])
{
c[k]=a[i];
i++;
k++;
}
else
{
c[k]=a[j];
j++;
k++;
}
}
if(i<=r)
for(i;i<=r;i++)c[k++]=a[i];
if(j<=rr)
for(j;j<=rr;j++)c[k++]=a[j];
for(i=l;i<=rr;i++)
a[i]=c[i];
}
void paixu(int l,int r)
{
if(l>=r)return ;
int mid=(l+r)/2;
paixu(l,mid);
paixu(mid+1,r);
hebing(l,mid,mid+1,r);
}
int main()
{
int i;
int n;
scanf("%d",&n);
for(i=1;i<=n;i++)
{
scanf("%d",&a[i]);
}
paixu(1,n);
for(i=n;i>=1;i--)
{
printf("%d",a[i]);
if(i!=1)printf(" ");
else printf("\n");
}
return 0;
}