C语言快速排序算法

基本思想:

        任取一个元素为中心,比它小的往前放,比他大的往后放,形成两个子表,再将两个子表重复上述步骤,最后子表只剩一个元素,排序结束。(递归

 

具体步骤:

  1.         取第一个数位中心元素,下标为0作为哨兵(暂时存放中心元素,排序下标为1~n的元素)。
  2. 从High开始比较,如果data[High]比中心元素大,循环执行--High
  3. 当data[High]小于中心中心元素时,把High位上的数移至Low位。并且进行Low++,下一次比较从data[Low]开始
  4. 当data[Low]小于中心元素时,循环执行++Low,当data[Low]小于中心元素时,Low位上的数移至High位,再进行High--,下一次又从data[High]开始比较。
  5. 重复以上步骤,当Low=High时停止,把data[0](中心元素)移至Low位,这样就形成了左边都小于中心元素,右边都大于中心元素的两部分,再将两部分重复1,2,3,4步骤,直到每个子表只剩一个元素

 

 C代码实现:

 

/***************************************************************************
*参数:
* 	data:待排序数组
* 	Start:数组起始下标,下标0不作为数据进行排序,所以从1开始
* 	End:最后一个数据下标
 *************************************************************************/
void QuickSort(int *data,int Start,int End)
{
	if(Start >= End)//如果长度小于1则返回
		return;

	int Low = Start,High = End;	

	int CenterDataPosition; //中心点元素位置
	data[0] = data[Low];	//取第一个元素为中心

	while(Low < High)
	{
		while(data[High] >= data[0] && Low < High)	{--High;}	//当处于High的数大于data[0]时,说明在中心元素右边,不进行移动,进行High--
		data[Low] = data[High];									//一旦有元素小于data[0],说明该元素中心元素左边,将它移至data[Low]
		while(data[Low] <= data[0] && Low < High)	{++Low;}	//与上同理
		data[High] = data[Low];
	}
			
	data[Low] = data[0];	//当low与high重合说明元素比较完成,low和high指向同一位置,该位置为空,将中心元素移动到此
	CenterDataPosition = Low;	//中心元素位low或high,因为high = low

	QuickSort(data,Start,CenterDataPosition-1); //对子表1再重复操作
	QuickSort(data,CenterDataPosition+1,End);	//对子表2.......
}

 算法分析:

  1. 时间复杂度:平均情况:O(n\log_{2}n),所有内排序算法中最好的
  2. 空间复杂度:平均需要的空间:O(\log n)的栈空间,最坏O(n)
  3. 快速排序是不稳定排序,即两个相同的数可能交换位置。

如果错误,请多指正!

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

qq_58481243

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

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

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

打赏作者

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

抵扣说明:

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

余额充值