C语言-快速排序

首先,我们随便找一个基准数来比较,通常为了方便,我们会以第一个数为基准数。

在初始状态下,我们会将14挪到中间的某个位置,也就是左边的小于14,右边的大于14,那怎么能做到左边小于14,右边大于14呢?

首先从右往左找,找到一个比14小的数,找到了,就停下来,将它赋值到14这个位置,,假设这个位置是i,接着再从左往右找,找到一个比14还大的数,找到了就停下来,将他赋值到上次那个从右往左找比14还小的数的那个位置i.这还没结束,我们要继续找,直到左边和右边相遇,就把14赋值给这个相遇的地方。

t

 

 

到此,14就归位了,接下来我们也要对每个数进行归位,那也就是我们可以对左边进行排序,然后再对右边进行排序,先处理3 0 12,再处理右边56 89 32 99 112 43,我们利用递归即可实现这个过程.

#include<stdio.h>
void Quentsort(int arr[],int left,int right)
{
	int i=left;   
	int j=right;
	int temp=arr[i];
	if(i>j)  //递归结束条件
	{
		return;
	}
	else
	{
		while(i<j)
		{
			while(i<j&&temp<arr[j])
			{
				j--;		
			}	
			if(i<j)
			{
				arr[i++]=arr[j];
			}
			while(i<j&&temp>arr[i])
			{
				i++;		
			}	
			if(i<j)
			{
				arr[j--]=arr[i];
			}
		}
	}
	arr[j]=temp;
	Quentsort(arr,left,i-1);  //递归左边
	Quentsort(arr,i+1,right); //递归右边
}
int main()
{
	//int arr[]={14,0,89,12,56,3,32,99,112,43};
	int i,j,arr[100000];
	scanf("%d",&j);
	for(i=0;i<j;i++)
	scanf("%d",&arr[i]);
	Quentsort(arr,0,j-1);
	for(i=0;i<j;i++)
	{
		printf("%d ",arr[i]);
	
	}
	return 0;
}