/**
* 快速排序就是选取数组中的一个基准值p
* 遍历整个数组 比p小的放到左边 比p大的放到右边
**/
public class Quick {
static void sort(int[] arr){
sort(arr, 0, arr.length - 1);
}
static void sort(int[] arr, int low, int hi){
if(low >= hi){
return;
}
int partition = partition(arr, low, hi);
// 调用递归对数组进行快排
sort(arr, low, partition - 1);
sort(arr, partition + 1, hi);
}
static int partition(int[] arr, int low, int hi){
int p = low; //以数组最左边的值为目标数
int left = low;
int right = hi + 1;
while(true){
while (arr[--right] > arr[p]){//从右往左找 如果找到一个数 比目标数小 则停止查找
if(right == low){
break;
}
}
while (arr[++left] < arr[p]){//往左往右找 如果找到一个数 比目标数大 则停止查找
if(left == hi){
break;
}
}
if(left >= right){//如果此时 ‘左指针’和‘右指针’指向同一个数 就说明数组已经遍历完了
break;
}else {
int tmp = arr[left];
arr[left] = arr[right];
arr[right] = tmp;
}
}
//交换目标数与最后找出的那个数字的位置 将目标数放到正确位置
int tmp2 = arr[left];
arr[left] = arr[p];
arr[p] = tmp2;
return left;
}
}
算法六之快速排序
最新推荐文章于 2024-08-16 23:08:28 发布