基本思想:
在所有元素中选取一个数字作为排列标准,并以此标准将数组分成两部分(大于该标准数的,以及小于该标准数的),并在每次循环将小于该数的置于一侧,大于该数的置于另一侧,不断递归以实现数组的排列。
具体实现:
关键部分,快排函数的编写。
快排函数的形参是数组地址,左界和右界;函数内容首先判断左界是否小于右界,并以此作为函数是否返回的标准;
其次,定义i,j变量对本次递归调用进行遍历,将i赋值为l-1,将j赋值为r+1,因每次递归遍历采用do,while语句,在进行判断前就对变量进行操作,并且选定lr的加和中值作为标准数坐标(即a[l+r>>1]为标准数);而后对本次递归的数组部分进行遍历排序,通过新变量i,j进行判断(因为只有函数内部的局部变量ij能够不断赋予新值,且在下一次递归调用时依旧以i=l-1,j=r+1开始;而lr所起到的作用更像是规定每次递归的数组范围,须在每次遍历完成后ij都指向本次递归数组中间地址时,才能实现lr数据的更新);while循环内部,通过do,while对两各部分内容进行判断,找到左侧大于标准数的数以及右侧小于标准数的数,swap对两数进行交换。需注意,因找到两数可能存在i>j的情况,此情况下,交换指令不应该被执行,因此swap前,应添加判断语句if(i<j);
快排是先对整个程序进行排序,而后分别对两个部分再进行排序,因此quick_sort函数,递归语句写在主题语句之后。
附源码:
#include<iostream>
using namespace std;
const int N=100010;
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];
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;
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;
}