快速排序的基本思想是选择一个中间元素(通常称为“枢轴”或“基准元素”),并根据该元素将数组分成两个子数组。然后递归地对这两个子数组进行排序,直到整个数组有序。
代码如下:
public class Test {
public static void quicksort(int[] array, int l, int r) {
//传入数组,以及检索开始的位置,检索结束的位置
if (l > r) {
//判断左边的索引如果大于右边的索引,则不合法,直接return
return;
}
int num = array[l];
//确定基准数为最左端的数
int p1 = l;
//定义变量p1指向最左端
int p2 = r;
//定义变量p2指向最右端
//当p1和p2不相遇的时候,在循环中进行检索
while (p1 != p2) {
//p2从右往左检索,如果检索到比基准数小的数就停下
while (array[p2] >= num && p1 < p2) {
p2--;
}
//p1从左往右检索,如果检索到比基准数大的数就停下
while (array[p1] <= num && p1 < p2) {
p1++;
}
//此时p1和p2均停止了,则将p1和p2位置的数交换
int temp = array[p1];
array[p1] = array[p2];
array[p2] = temp;
//交换结束判断p1和p2是否相遇,否则继续循环交换
}
//跳出循环,p1和p2相遇则将基准数与相遇位置的数交换
array[l] = array[p1];
//在将基准数赋值给相遇位置的元素
array[p1] = num;
//基准数回归以后再将基准数左边的元素快排;
quicksort(array, l, p1 - 1);
//基准数回归以后再将基准数右边的元素快排;
quicksort(array, p1 + 1, r);
}
public static void main(String[] args) {
int[] array = {1, 6, 9, 2, 4, 10, 3};
quicksort(array, 0, array.length - 1);
System.out.println("快排的后的数组顺序为:");
for (int j : array) {
System.out.print(j + " ");
}
}
}
在上面的代码中,quickSort方法用于递归排序整个数组,方法参数分别为要排序的数组和检索下标开始的位置和下标结束的位置,首先设置数组最左边的数是基准数,然后设置两个变量p1,p2分别从最左端,最右端开始检索,当p2检索到比基准数小的数就停下来,然后p1检索,当p1检索到比基准数大的数就停下来,两个位置的数交换位置,如此循环,当p1和p2相遇时跳出循环,将基准数与相遇位置的数交换位置,以基准数为枢轴,递归的对左子数组和右子数组再次进行快排。