手打快排
快排:快速排序是找出一个元素(理论上可以随便找一个)作为基准(pivot),然后对数组进行分区操作,使基准左边元素的值都不大于基准值,基准右边的元素值 都不小于基准值,如此作为基准的元素调整到排序后的正确位置。然后分治基准位置的左侧和右侧。
#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; void mysort(int *A,int L,int R){ //从小到大排序 if(L<R){ int key,low,high; key=A[L]; //取一个基准值,可以是任意,但这里用的是区间最左边的值 low=L; //区间左边指针low high=R; //区间右边指针high while(low<high){ while(low<high&&A[high]>=key){ //这里是递增排序 high--;//区间右端的值大于基准,右端指针向区间左侧逼近 } if(low<high) //减少重复操作 A[low++]=A[high];//小于基准的放左边 while(low<high&&A[low]<=key){ low++;//区间左端的值小于于基准,左端指针向区间右侧逼近 } if(low<high) A[high--]=A[low]; //大于基准的放右边 } A[low]=key;//将基准放到相对于基准来说已经有序的位置(即基准左侧都小于基准值,右侧都大于基准值) mysort(A,low+1,R);//分治基准左侧 mysort(A,L,low-1);//分治基准右侧 } } int main(){ int n; int a[1000]; scanf("%d",&n); for(int i=0;i<n;i++){ scanf("%d",&a[i]); } mysort(a,0,n-1); for(int i=0;i<n;i++) printf("%d\n",a[i]); return 0; } /* 5 1 2 0 6 -4 */
学学学 练练练 刷刷刷