一、介绍
快速排序是一个基于 分治 的排序方法,是非常重要且应用比较广泛的一种高效率排序算法。
二、原理
1.确定分界点,可以是数组左端点,右端点,中间点,也可以是随机值。
2.调整范围,设定一个分界点x后,让分界点将数组分为两部分,使得x左边的数都小于等于x,x右边的数都大于等于x。
3.递归排序,用递归处理左右两段
三、实现方法
首先设定两个指正i和j分别指向数组的左右端两侧,这里之所以不是指向左右两端,是因为每次i和j每次循环都要先移动,所以一开始移动需要保证先在左右两侧。
先判断i和j的大小,若i小于等于j时跳出循环。然后先选择呢一个分界点x,这里可以是最左端点q[l],从第一个元素开始判断,若q[i]小于x时则指针i往后进一,直到q[i]大于等于x时停下,此时移动j,从最后一个元素开始判断,若q[j]大于x时则指正向前进一,直到q[j]小于等于x时停下,此时将q[i]和q[j]的值交换,然后继续循环。在此x分界点循环结束后,对两段分别快排,一直递归。
下面是模版:
void quick_sort(int q[],int l,int r)
{
if (l>=r) return;
int x=q[l],i=l-1,j=r+1;//i和j每次先移动
while(l<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);
}
若选择x为q[l]则下面递归的时候一定要是(q,l,j)和(q,j+1,r),可作为模版被下来
下面是题解
#include<iostream>
using namespace std;
const int N = 1e6+10;
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;//i和j每次先移动
while(l<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 i=0;i<n;i++)
{
printf("%d ",q[i]);
}
return 0;
}