快速排序法

      快速排序法就是在数字里面选择一个基准数,我们记为A,这个基准数一般选择第一个数字,这样比较简单。然后我们从这个数列的两端开始探测,从右边找到比基准数小的数,我们记为B,从左边找到比基准数大的数字,记为C。但当他们探测还没有遇到一起的时候,这此时交换B和C。如果他们探测撞到一块,此时他们都指向同一个数字,记为D, 这个时候,D左边的所有数字都比A大,D右边的所有数字都比A小。则此时我们将D和A互换。


现在开始第一次探测。从左开始探测,首先c发现1比3小,c便停下来,B开始探索,B发现7大于3,B停下了。


此时B,C互换。第一次探测结束,结果如下:


接下来继续探测,C探测5时,5大于3,继续向左探测,直到C探测到2比3小时,停止。B开始向右探测,发现4大于3,则B停止,B,C互换值。互换之后结果为:

C开始继续向左探测,直到单侧到2时,C停下来了。由于此时B和C撞到一块,于是,和基准数互换。


互换后为,此时基数3已结归位。接下来以2作为新的基准数。此时第一轮的探测就结束了。


快速排序法要用到递归,现在要分别对3的左边和右边进行排序,首先对3左边的2和1进行排序。如下,然后跟前面的方法一样。


2和1排序结束后,整体顺序为:


现在我们要对3右边的数字进行排序。这时是以9位基准数。


方法和前面一样。C向左探测,发现7比9小,停止下来。B向右探测,寻找大于9的数字,直到B和C相遇,于是9和7交换。


根据递归,于是又对9左边的数字7,4,5进行排序,方法和前面的2和1排序方法相同。


最终排序结果如下:


通过测试程序,我们可以看到每次递归后的排序顺序。

#include<stdio.h>
#define N 10
int num[N];
int quick_sort(int L,int R)
{
	int left=L,right=R;
	int i;
	int base=num[L];
	int temp;
	if(L>R)
	 return 0; 
	 
	 while(right!=left)
	 {
	 	while(num[right]>=base&&right>left)//寻找右边小于base的值 
	    {
		  right--;
    	} 
	   while(num[left]<=base&&right>left)//寻找左边大于base 
	    {
		  left++; 
	    }
	//如果没有相遇,这左右值交换
	   if(right>left) 
	   {
		temp=num[left];
		num[left]=num[right];
		num[right]=temp;
	   }
	   for(i=1;i<=R;i++)
	 printf("%d\t",num[i]);
	 printf("\n");
	 } 

	//当左右相遇,基数归位 
	
	num[L]=num[right];
	num[left]=base;
	//num[R]=base;
	
	quick_sort(L,left-1);
	quick_sort(right+1,R);
} 
int main()
{
	int i=0,n=0;
	scanf("%d",&n);
	for(i=1;i<=n;i++)
	scanf("%d",&num[i]);
	//排序 
	quick_sort(1,n);
	for(i=1;i<=n;i++)
	printf("%d\t",num[i]);
	return 0;
}



最后附上完整代码:

#include<stdio.h>
#define N 10
int num[N];
int quick_sort(int L,int R)
{
	int left=L,right=R;
	int i;
	int base=num[L];
	int temp;
	if(L>R)
	 return 0; 
	 
	 while(right!=left)
	 {
	 	while(num[right]>=base&&right>left)//寻找右边小于base的值 
	    {
		  right--;
    	} 
	   while(num[left]<=base&&right>left)//寻找左边大于base 
	    {
		  left++; 
	    }
	//如果没有相遇,这左右值交换
	   if(right>left) 
	   {
		temp=num[left];
		num[left]=num[right];
		num[right]=temp;
	   }
	 } 

	//当左右相遇,基数归位 
	
	num[L]=num[right];
	num[left]=base;
	//num[R]=base;
	
	quick_sort(L,left-1);
	quick_sort(right+1,R);
} 
int main()
{
	int i=0,n=0;
	scanf("%d",&n);
	for(i=1;i<=n;i++)
	scanf("%d",&num[i]);
	//排序 
	quick_sort(1,n);
	for(i=1;i<=n;i++)
	printf("%d\t",num[i]);
	return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值