快速排序(C语言)



基本原理

  1. 选定一个基准数。
  2. 使用两个指针分别从两边开始遍历(先从左还是先从右遍历与基准数选取有关)。
  3. 从左向右走的指针如果遇到了比基准数小的数,继续右移;如果比基准数大,将其填入右指针所指的区域,然后开始移动右指针。
  4. 从右向左走的指针则相反。
  5. 当两个指针相遇,将基准数填入此时左右指针所指的区域。
  6. 此时基准数左所有的数都小于基准数,基准数右所有的数都大于基准数。
  7. 将基准数左和右分为两部分,利用递归对它们重复上列操作。



以最左或最右的数做基准数

若以最左的数做基准数时,先从右向左遍历。 若以最右的数做基准数时,先从左向右遍历。

void Sort(int *nums, int left, int right)
{
	int l = left;
	int r = right;
	int key = nums[l];     //以最左的数做基准数

	if (l >= r)
	{
		return;        //如果只有一个元素,则返回
	}
	else
	{
		while (l < r)
		{
			while (r > l && nums[r] > key)     //从右向左遍历
			{
				r--;
			}
			nums[l] = nums[r];         //将比基准数大的数放到右边
			while (l < r && nums[l] < key)     //从左向右遍历
			{
				l++;
			}
			nums[r] = nums[l];         //将比基准数小的数放到左边
		}
		nums[r] = key;       //填入基准数
	}
	Sort(nums, left, r - 1);
	Sort(nums, r + 1, right);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值