数据结构实验之排序一:一趟快排
Time Limit: 1000 ms Memory Limit: 65536 KiB
Problem Description
给定N个长整型范围内的整数,要求输出以给定数据中第一个数为枢轴进行一趟快速排序之后的结果。
Input
连续输入多组数据,每组输入数据第一行给出正整数N(N < = 10^5),随后给出N个长整型范围内的整数,数字间以空格分隔。
Output
输出一趟快速排序后的结果,数字间以一个空格间隔,行末不得有多余空格。
Sample Input
8
49 38 65 97 76 13 27 49
Sample Output
27 38 13 49 76 97 65 49
Hint
注:该题目只需要进行快速排序的一次步骤即可,不需要全部排出来;
还有一点就是该题需要用课本上的快排方法写~
这一段代码是经过修改原快排方式写的,很乱...但是满足课本内容的快排原理ac。
#include<stdio.h>
#include<string.h>
#include <stdlib.h>
long long int a[100009],n;
void qs(int left, int right)
{
int temp,i,t,j;
if(left > right)return;
i = left;j = right;
temp = a[left];
while(i != j)
{
while(a[j] >= temp && i <j)
j--;
a[i]=a[j];
while(a[i] <= temp && i <j)
i++;
a[j]=a[i];
/*if(i < j)
{
t = a[i];
a[i] = a[j];
a[j] = t;
}*/
}
a[i] =temp;
// qs(left,i-1);
// qs(i+1,right);
}
int main()
{
int n,i;
long long int t;
while(~scanf("%d",&n))
{for(i = 1;i <= n;i++)
{
scanf("%lld",&t);
a[i] = t;
}
qs(1,n);
for(i = 1;i <= n;i++)
{
if(i == 1) printf("%lld",a[i]);
else printf(" %lld",a[i]);
}
printf("\n");
}
return 0;
}
/*********** 该代码为课本方式写的快排,与题意无关,仅供参考 **************/
#include<stdio.h>
void qsort(int a[],int l, int r)
{
int key = a[l], i = l,j = r;
if(l > r)return;
while(i < j)
{
while(i < j && a[j] >= key)j--;
a[i] = a[j];
while(i < j && a[i] <= key)i++;
a[j] = a[i];
}
a[i] = key;
qsort(a, l, i - 1);
qsort(a, i + 1,r);
}
int main()
{
int b,i,a[100001];
while(~scanf("%d",&b))
{
for(i = 0; i < b; i++)
{
scanf("%d",&a[i]);
}
qsort(a, 0,b - 1);
for(i = 0; i < b; i++)
{
if(i == b - 1)
printf("%d\n",a[i]);
else printf("%d ",a[i]);
}
}
return 0;
}