标签:png load 遍历 while 默认 swa 代码实现 stat code
原理:递归+分治
从数组中选取一个基准点,将数组中小于这个基准点的元素放到基准点左边,大于这个基准点的元素放到右边
默认每次选取最后一个元素当作基准点,定义变量i,j分别指向数组的左端和右端前一个元素
i 向右移动扫描比基准点大的数, 如果比基准点小或等于则继续移动,
j 向左移动扫描比基准点小的数,如果比基准点大或等于则继续移动,
i,j要么是 i < j,要么是 i = j
i<j 说明遍历还未完成,则将 i,j元素交换位置
交换完成后,如果 i 还是小于 j 则说明遍历还未完成,i,j 继续移动,如果满足条件继续交换元素
如果 i=j,说明遍历完成,已经将所有小的数放到了基准点左边,大的数放到了基准点的右边
则,判断 i,j指向的数是否大于基准点,如果大于,交换 i 和基准点
此时 i,j指向的数就是新的基准点,基准点左边的数都小于它,基准点右边的数都大于它,
此时一轮排序完成,将新的基准点返回,此时数组被分割成了两段,将左边和右边的元素传入递归调用
分别选定基准点并进行划分,这个划分的流程跟上面的一致,但是数组的规模变小了,这就是分治的思想。
左递归
右递归
最后一次,以15为基准点,i,j都指向10,此时不满足交换条件,则递归结束,至此所有数字就找到了应在的位置
//交换函数
private static void swap(int[] arr, int i, int j) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
//入口函数
public static void quickSort(int[] arr, int left, int right) {
if (left < right) {//保证至少有两个元素要进行比较
int mid = devide(arr, left, right);
quickSort(arr, left, mid - 1);
quickSort(arr, mid + 1, right);
}
}
//划分函数
private static int devide(int[] arr, int left, int right) {
int i = left;
int j = right - 1;
int pivot = arr[right];
while (true) {
while (i < j && arr[i] <= pivot) i++;
while (i < j && arr[j] >= pivot) j--;
if (i < j) {
swap(arr, i, j);
} else {
break;
}
}
if (arr[i] > arr[right]) {
swap(arr, i, right);
}
return i;
}
标签:png load 遍历 while 默认 swa 代码实现 stat code
原文地址:https://www.cnblogs.com/fkPrograming/p/14521807.html