public static void quicksort(int[] arr,int start,int end){
//把数组中第0个作为标准数
int stard = arr[start];
//记录两个移动的坐标(两个小2兵)
//记录需要拍下的下标,刚开始是所有
//底的往高走,高的往低走
int low = start;
int high = end;
//循环找比标准数大的数和比标准数小的
//如果右面找到的数比基准数小,那么替换
//如果比基准数大,那么只移动坐标,向左移动就行
while(low<high){
//如果右面的数比标准数大,那么向前走
while(low<high&&stard<=arr[high]){
high--;
}
//如果右边的比基准数小,那么右边的数替换基准数
//不需要写循环,不满足上一个条件自己就跳出来了
arr[low] = arr[high];
//如果替换之后,左边的数小于基准数,那么向后走
while(low<high&&arr[low]<=stard){
low++;
}
//左边遇到比基准数大的数,去替换右边的
arr[high] = arr[low];
}
//当他们两个坐标重合后,把标准数填充到重合处
arr[low] = stard;
}
到这一步,做到:第一个数(基准数)把数组分割为两半,数组前面的是比基准数小的,后面都是比基准数大的
原数组:
第一步完成后:
加入递归:
//使用递归排序,得告诉他从哪排到哪
public static void quickSort(int[] arr,int start,int end){
//把数组中第0个作为标准数
int stard = arr[start];
//记录两个移动的坐标(两个小2兵)
//记录需要拍下的下标,刚开始是所有
//底的往高走,高的往低走
int low = start;
int high = end;
//循环找比标准数大的数和比标准数小的
//如果右面找到的数比基准数小,那么替换
//如果比基准数大,那么只移动坐标,向左移动就行
while(low<high){
//如果右面的数比标准数大,那么向前走
while(low<high&&stard<=arr[high]){
high--;
}
//如果右边的比基准数小,那么右边的数替换基准数
//不需要写循环,不满足上一个条件自己就跳出来了
arr[low] = arr[high];
//如果替换之后,左边的数小于基准数,那么向后走
while(low<high&&arr[low]<=stard){
low++;
}
//左边遇到比基准数大的数,去替换右边的
arr[high] = arr[low];
}
//当他们两个坐标重合后,把标准数填充到重合处
arr[low] = stard;
//现在高和低已经重合,我们需要使用上一轮的标准数把数组分割,然后重新再排
//start,end是输入的两个参数,没有变化
//递归
//处理所有小的数字
quickSort(arr,start,low);
//处理所有大的数字
quickSort(arr,low+1,end);
}
但这会无限的递归下去,直到栈溢出
我们需要加入一个停止递归的条件:
开始位置start得小于结束位置end,才可以不断地循环下去
//加入停止递归的条件
if (start < end) {
.......之上的代码
}
运行,就可以看到我们排好的结果了