快速排序思想: 快排的核心是分治。以从小到大排序为例,把第一个值作为基准值,先从最右边进行比较,若比基准值大,那么右边的指针左移一位,如果比基准值大,那么交换基准值和当前位置的值,改变比较方向,开始从最左边开始比较,若比基准值小,那么左边的指针右移一位,如果比基准值大,那么交换基准值和当前位置的值。每一轮的结果是基准被放在了正确的位置上,左边的指针位置等于右边的指针位置。此时数组被一分为二,左边的数都比基准值小,右边的值都比基准值大。分别对左边和右边的数使用递归做重复的操作。递归的出口 是左边只剩下一个值,右边只剩下一个值。
public static int[] quick(int[] num, int low, int high) {
int left = low;
int right = high;
int base = num[left];
while (left < right) {
//从右往左遍历
while (left < right) {
if (num[right] > base) {
right--;
} else {
int temp;
temp = num[right];
num[right] = base;
num[left] = temp;
left++;
break;
}
}
//从左往右遍历
while (left < right) {
if (num[left] < base) {
left++;
} else {
int temp;
temp = num[left];
num[left] = base;
num[right] = temp;
right--;
break;
}
}
}
//递归出口
if (left - 1 > low) {
quick(num, low, left - 1);
}
if (right + 1 < high) {
quick(num, right + 1, high);
}
return num;
}
快速排序的时间复杂度:
最坏情况下,时间复杂度是O(n^2);
最优情况下,时间复杂度是O(nlogn);
平均时间复杂度是O(nlogn);
快速排序空间复杂度:O(logn)