DESKTOP-S9OHBDA_20200902-王东东
问题:
快速排序:
public static void quickSort(int[] A, int left, int right) {
// 进行判断,如果左边索引比右边索引要大,是不合法的,直接使用return 结束这个方法
if (left > right) {
return;
}
// 定义变量保存到基准数
int base = A[left];
// 定义变量x,指向最左边
int x = left;
// 定义变量y,指向最右边
int y = right;
// 当x和y不相遇的时候,在循环中进行检索
while (x != y) {
// 向由y从右往左检索比基准数小的,如果检索到比基准数小的就停下
// 如果检索大比基准数大的或者相等的,就继续检索
while (A[y] >= base && x < y) {
y--;// 从右往左移动
}
// x从左往右移动
while (A[x] <= base && x < y) {
x++;// y从左往右移动
}
// x也停下了,y也停下了,然后交换x和y的位置的元素
int temp = A[x];
A[x] = A[y];
A[y] = temp;
}
// 如果上面while循环的条件不成立,会跳出这个循环,往下执行
// 如果这个条件不成立,说明x和y相遇了,交换基准数这个元素和相遇位置上的元素
// 把相遇位置上的元素赋值给基准数这个位置上的元素
A[left] = A[x];
// 把基准数赋值给相遇位置上的元素
A[x] = base;
// 基准数在这里就归位了,左边的数字都比他小,右边的数字都比他大
// 排基准数的左边
quickSort(A, left, x - 1);
// 排右边
quickSort(A, y + 1, right);
解决:
我理解的算法:
首先,会把数组中最左边的数当做基准数,然后从两边进行检索,,先从右边检索比基准数小的数;再从左边检索比基准数大的数;如果检索到了就停下,然后交换这两个元素,然后再继续检索,如果两个数一旦相遇,就停下检索,把基准数和相遇位置上的元素交换,基准数和相遇位置上的数交换完成后,表示第一轮排序结束,然后再进行第二轮、第三轮。
吐槽:
最近上课睡意来了,我可能提前要进入秋眠状态了。 ~~~,不、不、不,撑几个月,直接冬眠。
近期评论