#include<bits/stdc++.h>
using namespace std;
int n;
int a[20];
void f(int left,int right)
{
if(left >=right)
return;//1个或没有元素,结束返回
int t = a[left];//中心轴
int i = left,j = right;
while(i<j){
//从右到左
while(i!=j&&a[j]>=t)
j--;
a[i]=a[j];
//从左到右
while(i!=j&&a[i]<=t)
i++;
a[j]=a[i];
}
a[i] = t;//将中心轴放入左右left下标和right下标重合处
for(int j=0;j<n;j++)
cout<<a[j]<<" ";
cout<<endl;
f(left,i-1);//左侧递归
f(i+1,right);//右侧递归
}
int main(){
cin>>n;
for(int i=0;i<n;i++)
cin>>a[i];
f(0,n-1);
for(int j=0;j<n;j++)
cout<<a[j]<<" ";
cout<<endl;
}
快速排序:1.选定Pivot中心轴。
2.将大于Pivot的数字放到Pivot的右边。
3.将小于Pivot的数字放到Pivot的左边。
4.对左、右两侧递归直至没有或剩余一个数字。
注:代码采用的是先从右边查找一个小于中心轴的数字(大于比较上一个)放到左边,再从左侧查找一个大于中心轴字(小于比较上一个)放到右边,直至左右索引重合,将中心轴放到二者重合的位置。(如果是有序序列,右索引会一直访问到与左索引重合,序列不会发生变化———这里单纯是我当时没想明白,嘿嘿)