快速排序
1、原理以及具体实现
1、首先将待排序数组中第一个数作为基准数
2、定义两个游标left,right分别表示标识数组的开始和结束
3、定义两个游标i,j用于分别寻找比基准大的数,比基准小的数
4、j游标向前移动直到找到第一个比基准数小的数值停止,但要保证j不能小于i
//j去找比当前基准小的
while (arr[j]>=base&&i<j){//同时保证j不能小于i
j--;
}
5、i游标向后移动直到找到第一个比基准数大的数值停止,但要保证i不能大于j
//i去找比当前基准大的
while (arr[i]<=base&&i<j){//同时保证j不能小于i
i++;
}
6、i,j对应的数值进行交换
7、重复4,5,6步直到i,j相遇
8、基准数和相遇位置的数进行交换,此时你会发现基准数已经放在了最终结果的位置
9、以基准数为起始点,分为左右两部分,重复前6步,直到数据都被拆分开为止
2、图示
3、代码实现
递归边界设置为left>=right,而不仅仅是left=right的原因是可能会出现下面的情况
public static void quicksort(int[] arr,int left,int right){
if(left>=right){
return;
}
int i=left,j=right;
int base=arr[left];
while (i!=j){
//j去找比当前基准小的
while (arr[j]>=base&&i<j){
j--;
}
while (arr[i]<=base&&i<j){
i++;
}
int temp=arr[i];
arr[i]=arr[j];
arr[j]=temp;
}
arr[left]=arr[i];
arr[i]=base;
//递归操作左右两个子数组
quicksort(arr,left,j);
quicksort(arr,j+1,right);
}