手打快排
快排:快速排序是找出一个元素(理论上可以随便找一个)作为基准(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
*/
学学学 练练练 刷刷刷

浙公网安备 33010602011771号