快速排序算法

一、快速排序

: 快速排序是C.R.A.Hoare于1962年提出的一种划分交换排序。它采用了一种分治的策略,通常称其为分治法(Divide-and-ConquerMethod)。
该方法的基本思想是:
1.先从数列中取出一个数作为基准数。
2.分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。
3.再对左右区间重复第二步,直到各区间只有一个数。

动态样例 :

(6)(10)(13)(5)(8)(3)(2)(11)  		:x=6; i=l=0; j=r=7;

i                       j 
x=6;

开始之前把基准数6放在x中,i=l=0,j=r=7;

第一轮开始: 先从右边开始移动j--,寻找小于基准数x的数字s[j]; 
			
			 ( 2)(10)(13)(5)(8)(3)( )(11)  		
			
			 x i                  j 

			 (2)( )(13)(5)(8)(3)(10)(11)
			      i               j
		
			 (2)(3)(13)(5)(8)( )(10)(11)
                  i           j 
             
             (2)(3)( )(5)(8)(13)(10)(11)
                    i         j 
                    
             (2)(3)( )(5)(8)(13)(10)(11)
                    i  j 
                    
             (2)(3)(5)(6)(8)(13)(10)(11)
                      i j 当i不再<j时第一轮结束,结束时i指向的位置是空的,将x中的值放进去即可。
                      
第一轮数据结束该数列分为了三部分( 2 3 5)   6  (8 13 10 11),中间部分的位置已经确定了接下来只需

要将左右两边的数据直接递归下去即可,

  左边已经排好序了 

   2 	3 	5
  x i       j   
  
  来看右边
  
   8 	13 	10 	11 
  ij 
   
  13  10  11 
   i   j  
   
  10  (13)  11 
	   ij	
	   
  结束!

上程序:
qsort(int a[],int l,int r)//每一次都从l~r
{
int i=l,j=r,x=a[l];//为方便,基准数在这里选的是数列的第一位,i从l开始往后找大于基准数的元素,j从r开始往前找找小于基准数的元素
while(i<j)
{
while(i<j && s[j]>=x) j–;//先移动j,从右开始找小于基准数x的元素,什么时候退出while循环说明找到了
if(i<j)
{
s[i]=s[j]; //找到后将该元素放在s[i]的位置上,然后开始将i往后移动
i++;
}
while(i<j && s[i]<=x) i++;//移动i,从左开始找大于基准数x的元素,什么时候退出while循环说明找到了
if(i<j)
{
s[j]=s[i]; //找到后将该元素放在s[j]的位置上,然后开始将j往左边移动
j–;
}
}
s[i]=x;//i的位置是目前基准数x的位置。
if(l<i) qsort(a,l,i-1); //递归前先观察下左区间的元素个数,个数大于1则递归,否则不递归
if(i+1<r) qsort(a,i+1,r); //递归前先观察下右区间的元素个数,个数大于1则递归,否则不递归
}
int main()
{
int a[9]={0,6,10,13,5,8,3,2,11};
qsort(a,0,7);
for(int i=0;i<8;i++)
{
cout<<a[i]<<" ";
}
return 0;
}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

NOI_赵小龙

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值