C语言使用递归调用实现的快速排序

#include <stdio.h>

/*
快速排序描述:
1.从数列中挑出一个元素,称为 "基准"(pid)
2.重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。
在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作。
3.递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。

  示例代码:示例代码为C语言,输入参数中,需要排序的数组为arr[],取出一个元素为pivot,并根据 pivot值,
将数组按照大于pivot和小于pivot分为两个区域,递归完成排序。

  算法分析:
  最差时间复杂度  Θ(n2)   最优时间复杂度  Θ(nlog n)   平均时间复杂度  Θ(nlog n)。

  原理:
  已知一组无序数据a[1]、a[2]、……a[n],需将其按升序排列。首先任取数据a[x]作为基准。比较a[x]与其它数据并排序,
  使a[x]排在数据的第k位,并且使a[1]~a[k-1]中的每一个数据<a[x],a[k+1]~a[n]中的每一个数据>a[x],然后采用分治的
  策略分别对a[1]~a[k-1]和a[k+1]~a[n]两组数据进行快速排序。

  优劣:
  优点:极快,数据移动少;缺点:不稳定。

*/


//快速排序
//参数说明:a是要排序的数组,begin是要排序数组的开始位置,end数组结束下标。
void Quick_sort(unsigned char *a,unsigned char begin,unsigned char end)
{
  unsigned char pid,i,j;

  pid=a[begin];
  i=begin;
  j=end;
  
  while(i<j) //完成比pid大的在pid右边,比pid小的在pid左边
  {
    while( (i<j)&&(a[j]>pid) )
j--;
a[i]=a[j];
while( (i<j)&&(a[i]<=pid) )
i++;
     a[j]=a[i];
  }

 a[i]=pid;  

 //递归调用左半部数组部分
  if((i-1)>begin)
   Quick_sort(a, begin,i-1);

  //递归调用右半部数组部分
  if(end>(i+1))
   Quick_sort(a, i+1,end);

}




void main()
{
unsigned char i;
unsigned char aa[20]={14,13,34,54,67,34,21,4,5,90,76,23,11,10,7,8,56,40,16,4};
    Quick_sort(aa,0,19);

for(i=0;i<20;i++)
printf("%d\n",aa[i]);

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值