快速排序讲解
快速排序采用的是分治思想,是一个将整体问题化为与之相似的局部问题,层层划分,最终大事化小,小事化了的思想。
这么说可能让人听着很懵,那不急,让我来带大家通过快速排序来理解分治思想。
快速排序的步骤有三步
-
首先设定一个分界值,通过该分界值将数组分成左右两部分。这一步就是体现了分治的“分”字,将大的整体,分为两部分。
这一步需要选取一个分界值,这个值是任意的,具体实现时这个值可以是数组的第一个元素,也可以是最后一个元素,也能是中间元素。
-
然后将大于或等于分界值的数据放到数组右边,小于分界值的数据放到数组的左边。此时,左边部分中各元素都小于分界值,而右边部分中各元素都大于或等于分界值。
-
接下来,我们要把左右部分再各自分为左右两部分,重复第一步。这一步体现了递归的思想。
简化一下语言,如下
-
确定分界点
-
调整区间
两个区间,第一个区间小于等于x,第二个区间大于等于x
-
递归处理左右两段
代码实现的时候可以用一种更优雅的方式,即指针交换法,具体过程如下图所示
代码如下
#include <iostream>
using namespace std;
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);
}
const int N = 1000;
int q[N];
int main()
{
int n;
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\n",q[i]);
return 0;
}