蒟蒻求助
查看原帖
蒟蒻求助
313756
KobeBryant924楼主2021/6/7 21:26
#include<stdio.h>
//从小到大,快速排列 
int a[1000001],n;//全局变量,在子函数中都要用到  
void asort(int left,int right)//排列范围的左右界限 
{
	int i,j,t,tmp;
	
	tmp=a[left];//选取左端作为基准数
	i=left;
	j=right; 
	
	if(left>right)
		return;//左右相反,直接返回
		
	while(i!=j)//一趟结束后ij要碰头 当未碰头时
	{
	//先从右往左找,找到一个比tmp小的数为止
		while(a[j]>=tmp&&i<j)//这里要大于等于,才能找到小的数 
			j--;
	//再从左往右找一个比tmp大的数 
		while(a[i]<=tmp&&i<j)
			i++;
			
	//交换两元素在数组中位置
		if(i<j)//i,j没有相遇时 
		{
			t=a[i];
			a[i]=a[j];
			a[j]=t;
		 } 
	} 
	//此时i=j a[i]左面的数都比tmp小,右面的数都比tmp大
	 
	//将基准数(最左段数)归位到数组中去,与a[i]互换位置 
	a[left]=a[i];
	a[i]=tmp;
	asort(left,i-1);//继续处理左边的,因为左面的比tmp小,但左面本身还是无序的,这里是一个递归的过程 
	asort(i+1,right);//继续处理右边的,这里是一个递归的过程
}

int main() 
{ 
 int i,j,t; 
 //读入数据 
 scanf("%d",&n); 
 for(i=1;i<=n;i++) 
 scanf("%d",&a[i]); 
 asort(1,n); //快速排序调用 
 
 //输出排序后的结果 
 for(i=1;i<=n;i++) 
 printf("%d ",a[i]); 
// getchar();getchar(); 
 return 0; 
}

奆佬能看下为什么只过了两个点吗..谢谢!

2021/6/7 21:26
加载中...