快排【基础算法】

快排是我们给一组数据进行排序的常见算法,接下来我将介绍一下它的用法思路和模板。

目录

一、思路和步骤

二、模板


一、思路和步骤

先简单介绍一下步骤:

第一步:确定一个分界点x(建议取中间数)

第二步:调整区间,让   x左边的数都<=x,   x右边的数都>=x.

第三步:递归处理左右两边。

举例:

3   5   2   4   1     

^        x          ^     

第一步,取分界点x,这里取x=2

第二步,调整区间:

用两个指针,l指向数组最左边,r指向数组最右边。

对于指针l:判断它指向的数是否为小于x的数,若小于,则指针l+1,直到指针l指向的数不小于x时,停下;

对于指针r:判断它指向的数是否为大于x的数,若大于,则指针r-1,直到指针r指向的数不大于x时,停下;

然后交换两个指针指向的内容;经过1次交换后:

1  5  2  4  3     1  5  2  4  3

    ^        ^         ^   ^

1  2  5  4  3  

     r   l

重复上述过程,直到两指针相遇时(l>i),数组被分成了两份,x(2)左边全是小于等于它的数,

x(2)右边全是大于等于它的数。

然后,分别再对这指针l(或i)的左右两部分重复上述过程(也就是递归)

二、模板

#include 
using namespace std;
const int N = 1e6 + 10;
int q[N];
void quick_sort(int q[], int l, int r)
{
	if (l >= r)return;
	int i = l - 1, j = r + 1, x = q[l + r >> 1];//相当于除以2
	while (i < j)
	{
		do i++; while (q[i] < x);
		do j--; while (q[j] > x);
		if (i < j)swap(q[i], q[j]);
	}
	quick_sort(q, l, j);
	quick_sort(q, j + 1, r);
}
int main()
{
	int n = 0;
	scanf("%d", &n);
	for (int i = 0; i < n; i++)scanf("%d", &q[i]);

	quick_sort(q, 0,n-1);

	for (int i = 0; i < n; i++)printf("%d", q[i]);
	return 0;
}

你可能感兴趣的:(基础算法,算法)