基本思想:
取待排序数组的第一个元素作为基准
每一轮排序将比基准数小的元素移动到基准数左边,比基准数大的元素移动到基准数右边
具体步骤为:
(1)分别使用左右指针指向待排序数组左右的元素
(2)首先让右指针开始向左移动,直到找到一个小于基准数的元素
(3)左指针向右移动,直到找到一个大于基准数的元素
(4)两两交换
(5)重复此步骤,直到两指针相等,将此时指针指向元素与数组第一个元素进行交换
再对基准数左右的子数组进行相同的快速排序,以此递归下去,得到有序数组
代码实现:
//快速排序
public void quickSort() {
int left = 0;
int right = array.length - 1;
quickSort(left, right);
}
public void quickSort(int left, int right) {
if (left < right) {
int l = left;
int r = right;
int midVal = array[l];
int temp;
while (l < r) {
while (midVal <= array[r] && l < r) {
r--;
}
while (midVal >= array[l] && l < r) {
l++;
}
if (l < r) {
temp = array[l];
array[l] = array[r];
array[r] = temp;
}
}
array[left] = array[l];
array[l] = midVal;
quickSort(left, l - 1);
quickSort(l + 1, right);
}
}
时间复杂度:O(nlogn)
稳定性:
由于在左右指针指向的数于基准数比较并进行两两交换的过程中,可能会导致相同元素的相对位置改变,故快速排序是不稳定的。