思路
- 从数组中选取一个基准值,然后把比基准值小的都放在其左边,比基准值大的都放在右边,如果相同放任意一边都可
- 根据基准值就可以把一个数组拆分成两个数组,然后再对这两个数组再进行上述操作
- 最后就可以得到有序数组了
Code
public class QuickSort {
public void sort(int[] arr) {
sort(arr, 0, arr.length - 1);
}
private void sort(int[] arr, int start, int end) {
if (start < end) {
int partitionIndex = getPartitionIndex(arr, start, end);
sort(arr, start, partitionIndex - 1);
sort(arr, partitionIndex + 1, end);
}
}
private int getPartitionIndex(int[] arr, int start, int end) {
int partitionNum = arr[start];
int i = start;
int j = end;
while (i < j) {
while (arr[j] >= partitionNum && i < j) {
j--;
}
while (arr[i] <= partitionNum && i < j) {
i++;
}
swap(arr, i, j);
}
swap(arr, start, i);
return i;
}
private void swap(int[] arr, int i, int j) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
时间复杂度:O(nlogn)
空间复杂度:O(logn)
稳定性:不稳定
|