//str为需要排序的数组,l为str的起始位置,r为str的长度-1,m为一个默认特殊点
public static void quick(int[] str,int l,int r,int m) {
//如果数组为空,则直接返回
if(str==null) return;
//如何数组长度为1,则不需要排序,直接返回
if(str.length==1) return;
//递归的出口
if(r-l<1) return;
//调用findMiddle函数,使得数组str[m]左边部分的每一个数比这个数小,右边部分的每一个数比这个数大
m=findMiddle(str,l,r,m);
//递归左边部分
quick(str,l,m-1,l);
//递归右边部分
quick(str,m+1,r,m+1);
}
//返回一个值m,使得数组str[m]左边部分的每一个数比这个数小,右边部分的每一个数比这个数大
private static int findMiddle(int[] str,int l,int r,int m) {
//递归出口
if((r-l)<1) return m;
//从后往前遍历,如果发现str[m]大于str[r]则交换两者,则str[m]右边的数都比str[m] 大
for(;r>=m;r--) {
if(str[m]>str[r]){
swap(str,m,r);
m=r;//1
break;
}
}
//从前往后遍历,如果发现str[m]小于str[r]则交换两者,则str[m]左边边的数都比str[m] 小
for(;l<=m;l++) {
if(str[m]<=str[l]){
swap(str,m,l);
m=l;//2
break;
}
}
//因为此时 l 不一定等于 r (此时 l< r或者l==r) 索引 l 与 索引 r 之间有一无序数据 所以需要对上面的两部分再执行一遍,因此需要递归.
//当r-l<1,函数会返回一个值m,说明此时的m使得数组str[m]左边部分的每一个数比这个数小,右边部分的每一个数比这个数大
return findMiddle(str,l,r,m);
}
//交换函数
public static void swap(int[] data,int index1,int index2) {
int s = data[index1];
data[index1]=data[index2];
data[index2]=s;
}