快速排序

快速排序

快速排序其实很简单,静下心来看一遍,很快就会了

1.算法思想
(1)
从待排序数组序列中选取一个元素(通常选取第一个元素)为枢纽,设其关键字为x,然后将数组中其余小于x的元素移到前面,将大于或等于x的元素移到后面,将待排序的数组分成了两个子表,将x元素插到其分界线的位置。这个过程称为 一趟快速排序
(2) 经过一次划分后,就以元素x为界,将待排序数组分成了两个子表,而且前子表中的所有元素都小于x,后面子表中的所有元素都大于或等于x,对分割后的子表按照 步骤(1)的方法继续进行分割,直到所有子表的长度不超过1为止。这时待排序的数组就变成了一个有序数组。

2.算法步骤
假设待排序序列为arr[left], arr[left+1], arr[left+2], …, arr[right-1],arr[right]。首先将第一个元素arr[left]移动至变量x中,这时候arr[left]就相当于一个空单元,然后反复进行一下两个操作,直到left和right相遇。
(1) right从右向左扫描,遇到arr[right] < x时,将arr[right]移动至空单元arr[left]中,此时arr[right]相当于一个空单元。
(2) left从左向右扫描,直到arr[left] > x时,将arr[left]移动至空单元arr[right]中此,时arr[left]就相当于一个空单元。
循环执行以上操作,直到left和right相遇时,arr[left] (或arr[right])就相当于一个空单元,并且arr[left]左边的所有元素都小于x,右边的所有元素都大于或等于x,最后将x放入arr[left]中,就完成了一次划分过程。接下来对左右两边的子表使用相同的办法进行进一步划分。
在这里插入图片描述
在这里插入图片描述
3.算法实现

void Quick(int arr[], int left, int right, int n)//完整的快速排序算法
{
	int ret;
	if (left < right)
	{
		ret = Quick_sorting(arr, left, right);//ret为两个子表分界点
		Quick(arr, left, ret - 1, n);
		Quick(arr, ret+1, right, n);
	}
}

int Quick_sorting(int arr[], int left, int right)//一趟快速排序算法
{
	int x = arr[left];
	while (left < right)
	{
		while (left < right && arr[right] >= x)
		{
			right--;
		}
		if (left < right)
		{
			arr[left] = arr[right];
			left++;
		}
		while (left< right && arr[left] < x)
		{
			left++;
		}
		if (left < right)
		{
			arr[right] = arr[left];
			right--;
		}
	}
	arr[left] = x;
	return left;
}

keep going on!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值