快速排序也属于一种交换排序算法,排序的过程中不停地有元素交换,但是因为其在均匀分布的数据中有比较良好的排序效果,因此被广泛利用。
private static int getMiddle(int[] array, int low, int high) {
int temp = array[low];
while (low < high) {
while (low < high && array[high] >= temp) {
high--;
}
array[low] = array[high];
while (low < high && array[low] <= temp) {
low++;
}
array[high] = array[low];
}
//此时low=high,所以这个时候还应该把原来的值附到中间值去
array[low] = temp;
return low;
}
private static void quickSort(int[] array, int low, int high) {
//此处递归调用即可
if (low < high) {
int middle = getMiddle(array, low, high);
quickSort(array, low, middle - 1);
quickSort(array, middle + 1, high);
}
}
public static void sort(int[] array) {
if (array == null || array.length <= 1) {
return;
}
quickSort(array, 0, array.length - 1);
}
快排的思路就不介绍了,满大街都有讲快排的。这里给出的代码是我觉得比较优化的实现方案,实现方案也比较简单。
其中就是每一次getMiddle之后然后折半递归,最终求得排序结果。
最优时间复杂度:O(nlogn)
平均时间复杂度:O(nlogn)
最坏时间复杂度:O(n^2),快排在对有序数组进行排序时候因为每次都是涉及到全部的交换操作,所以复杂度退化为n^2,所以在面对基本有序的排序算法选择时候,一般会选择堆排或者归并排序算法。
平均空间复杂度:O(nlogn),针对快排的空间负复杂度,或许有的人会有这样的疑问:快排不是每次只借助了一个空间吗?不应该是O(1) 吗?
就空间复杂度来说,主要是递归造成的栈空间的使用,最好情况,递归树的深度为log2n,其空间复杂度也就为O(logn),最坏情况,需要进行n‐1递归调用,其空间复杂度为O(n),平均情况,空间复杂度也为O(logn)。