快速排序的核心点是:
将数组的第一个元素当做一个基准点,然后从数组的两端向中间遍历数组。
即:从右往左遍历数组,查找小于基准点的值。然后从左往右遍历数组查找大于基准点的值。当找到后,将这两个值进行交换,然后在继续遍历查找。
快速排序和冒泡排序的最明显区别就是,快速排序交换的不一定是两个相邻的元素,它的元素交换是跳跃式的。而冒泡排序它是交换两个相邻的元素,已达到目的。
快速排序的具体细节如下代码所示:
// 用法
int[] nums = new int[]{5, 3, 6, 9, 15, 12, 16, 2, 1};
quickSort(nums, 0, nums.length-1);
for (int i=0;i<nums.length;i++) {
System.out.println(nums[i]);
}
// 快速排序
private static void quickSort(int[] nums, int left, int right) {
if (left > right) {
return;
}
// 左右指针
int i = left;
int j = right;
// 基准点
int base = nums[left];
int temp;
while (i != j) {
// 从右往左找小于基准点的值
while (i<j && nums[j] >= base) {
j--;
}
// 从左往右找大于基准点的值
while (i<j && nums[i] <= base) {
i++;
}
if (i<j) {
temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
}
}
nums[left] = nums[i];
nums[i] = base;
quickSort(nums, left, i-1);
quickSort(nums, i+1, right);
}