#include <stdio.h>
#define NR(x) sizeof(x)/sizeof(x[0])
int partitions(int a[],int low,int high);
void quicksort(int a[],int low,int high);
void print(int *a,int count){ //打印数组
int i;
for(i=0;i<count;i++){
printf("%d ",a[i]);
}
printf("\n");
}
int main(void){
int a[]={12,68,0,1,65,2,23,1,5,99,30,12};
print(a,NR(a)); //排序前打印
quicksort(a,0,NR(a)-1);
print(a,NR(a)); //排序后打印
return 0;
}
/*
将数组小标为0的的值(a[0]),作为排序基准值。
将low=0,high=NR(a)并取对应的基准值对比,即分成两端进行
1、high端,比基准值小的往则将对应的值往low端扔,扔完high自身减去1.否则自身减去1
2、low端,如果比基准值小或者等于基准值,则low--,否则将low对应的值往高处high扔,并且high自身减去1
3、由于1步骤中将low值覆盖,因此当low=high时 low对应的数值元素刚好为基准值
*/
int partitions(int a[],int low,int high){
int pivotkey=a[low]; //将比较的key设置为数组的最低值
// printf("%d\n",pivotkey);
while(low!=high){ //当low!=high时进行比较操作
while(a[high]>pivotkey&&low<high) //1、low<high,当最高位大于基准时,不进行交换。并将最高位的下标减1
high--;
if(low<high){ //2、low<high,在1的基础上推出,a[high]<=pivotkey时,将小标为high的值给a[low],并且low自身加1
a[low++]=a[high];
}
while(a[low]<=pivotkey&&low<high)//3、当数组下标最低为low的值小于或等于基准时,low自身+1
low++;
if(low<high){ //4、当low<high时,在3的基础上推出a[low]>pivotkey时,并交换最高位和最低位
a[high--]=a[low];
}
}
a[low]=pivotkey;//此时low=high
// print(a,NR(a));
return low;
}
void quicksort(int a[],int low,int high){
int pivottag;
if(low<high){
pivottag=partitions(a,low,high);
qsort(a,low,pivottag-1); //二分法进行分段递归排序
qsort(a,pivottag+1,high);
}
}