# 0001|快速排序

64 阅读1分钟

0001|快速排序

对于一个数组的快速排序,有暴力的快速排序,以下是代码的实现:

#include <cstdio>
#include <iostream>

using namespace	std;

const int N = 1e6;
int n;
int q[N];

void quick_sort(int q[], int l, int r)
{
	if(l>r)	return;
	int x=q[l], i = l-1; j = r+1; 
	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()
{
	scanf("%d", &n);
	for(int i = 0; i <n; i++)	scanf("%d", &q[i]);
	quick_sort(q, 0, n-1);
	for(int j = 0; j <n; j++)	printf("%d ", q[j]);
	return 0;
}

数组的排序思想

利用递归的方法,对于一个数组中的数,可以列为在数轴上的数,利用指针的思想,我们可以把头和尾部的数,作为i和j的起点,分别的++进行靠拢排序。

以'x = q[l]'作为枢轴,这样对于比x大的数排成一部分,比x小的数排成一部分,在利用递归的思想,我们就可以将所有的数,排列。

在递归期间,swap函数,只是更换了数值,并不是更换地址位置,do-while函数,完全的避免了边界问题。

在更换位置后,其 i 和 j 的值是不变的,在外部的while的条件下可以再次进行循环,使得数轴上的值完全的向着 小于枢轴 大于枢轴的目标移动。