递归函数
终止条件,选轴值,放最后,找划分,与最后交换,左右两边再递归
找轴值函数
划分函数
两边走,停止交换要加减,返回左位置
细节问题
这次重写快速排序,发现了一些细节问题都没有注意到,主要是划分函数两边的指针走动时候什么时候停止此时又是什么情况。
细节一:必须先左后右,如果相反的,r停再l处,而l是小于轴值的话不应调换
细节二:划分函数当输入的参数l,r相等时,而A[l]又小于pivots时候应该换它
//递归函数qsort:终止条件,选轴值,放最后,找划分,与最后交换,左右两边再递归
//划分函数partition:两边走,停止交换要加减,返回左位置
//注意细节问题:
#include <bits/stdc++.h>
using namespace std;
inline int partition(int A[],int l,int r,int pivot){
//l,r并不是一起动的,而是先l动,然后r动,
//细节一:必须先左后右,如果相反的,r停再l处,而l是小于轴值的话不应调换
//所以当它俩相等时即找到应该返回的位置
//划分位置左边都是小于轴值的,右边都是大于等于轴值的
//do-while和while的区别,do-while是先执行后判断至少执行一次,while是先判断后执行可以不执行
while(l<r){
while(l<r&&A[l]<pivot) l++;
while(l<r&&A[r]>=pivot) r--;
//交换此时l,r位置的两个元素
if(l<r){//优化l,r相等时候没偶必要的交换
int temp=A[l];
A[l]=A[r];
A[r]=temp;
}
}//l==r相遇时候退出循环
//细节二:当输入的参数l,r相等时,而A[l]又小于pivots时候应该换它
if(A[l]<pivot) l++;
return l;
}
int findpivot(int i,int j){
return (i+j)/2;
}
void qsort(int A[],int i,int j){
//递归终止条件
if(j<=i) return ;
//选轴值与最后一个元素交换
int pivotindex=findpivot(i,j);
int pivot=A[pivotindex];
A[pivotindex]=A[j];
A[j]=pivot;
//进行划分,返回左右指针相遇的位置
//划分区间注意
int k=partition(A,i,j-1,pivot);
//将轴值放回到该放的位置
int temp=A[k];
A[k]=A[j];
A[j]=temp;
qsort(A,i,k-1);
qsort(A,k+1,j);
}
int main()
{
while (true)
{
int n;
cin>>n;
int a[n];
for(int i=0;i<n;i++)
cin>>a[i];
//int a[4]={7,4,8,11};
qsort(a,0,n-1);
for(int i=0;i<n;i++) cout<<a[i]<<",";
}
return 0;
}