数据结构实验之排序八:快速排序
Time Limit: 1000MS
Memory Limit: 65536KB
Problem Description
给定N(N≤10^5)个整数,要求用快速排序对数据进行升序排列,注意不得使用STL。
Input
连续输入多组数据,每组输入数据第一行给出正整数N(≤10^5),随后给出N个整数,数字间以空格分隔。
Output
输出排序后的结果,数字间以一个空格间隔,行末不得有多余空格。
Example Input
8 49 38 65 97 76 13 27 49
Example Output
13 27 38 49 49 65 76 97
#include <stdio.h>
#include <stdlib.h>
int N,a[1000009];
void shiftdown(int i)
{
int t,x;
t=i;
while(2*i+1<=N-1)
{
if(a[i]<a[i*2+1])
{
t=i*2+1;
}
if(a[t]<a[i*2+2]&&(i*2+2)<=N-1)
{
t=i*2+2;
}
if(i!=t){x=a[t];a[t]=a[i];a[i]=x;i=t;}
else break;
}
}
void sort()
{
int x;
while(N)
{
x=a[0];
a[0]=a[N-1];
a[N-1]=x;
N--;
shiftdown(0);
}
}
int main()
{
int i,n;
while(scanf("%d",&N)!=EOF)
{
n=N;
scanf("%d",&a[0]);
for(i=1;i<=N-1;i++)
{
scanf("%d",&a[i]);
}
for(i=(N/2)-1;i>=0;i--)
{
shiftdown(i);
}
sort();
for(i=0;i<=n-1;i++)
{
if(i!=n-1)
printf("%d ",a[i]);
else
printf("%d\n",a[i]);
}
}
return 0;
}
#include <stdio.h>
#include <stdlib.h>
int N,a[1000009];
void shiftdown(int i)
{
int t,x;
t=i;
while(2*i+1<=N-1)
{
if(a[i]<a[i*2+1])
{
t=i*2+1;
}
if(a[t]<a[i*2+2]&&(i*2+2)<=N-1)
{
t=i*2+2;
}
if(i!=t){x=a[t];a[t]=a[i];a[i]=x;i=t;}
else break;
}
}
void sort()
{
int x;
while(N)
{
x=a[0];
a[0]=a[N-1];
a[N-1]=x;
N--;
shiftdown(0);
}
}
int main()
{
int i,n;
while(scanf("%d",&N)!=EOF)
{
n=N;
scanf("%d",&a[0]);
for(i=1;i<=N-1;i++)
{
scanf("%d",&a[i]);
}
for(i=(N/2)-1;i>=0;i--)
{
shiftdown(i);
}
sort();
for(i=0;i<=n-1;i++)
{
if(i!=n-1)
printf("%d ",a[i]);
else
printf("%d\n",a[i]);
}
}
return 0;
}