快速排序
该排序算法被认为是目前最好的一种内部排序方法。但它是不稳定的。在最优情况下,是每次都平分数组。而在最差情况下,即选取了一个最大或最小的元素当做基准数,时间复杂度与空间复杂度都会变成最差。
最差情况
当选取的基准数为最大(或最小)的情况,退化为冒泡排序。
代码如下
import java.util.Arrays;
public class QuickSort6 {
public static void quickSort(boolean flag, int []arr, int low, int high) {
if(low>=high) {
return;
}
//1.定义基准数
int t = arr[low];
int l = low; //记录最左边下标号
int h = high; //记录最右边下标号
while(low < high) {
if(flag) {
//2.升序
while(low<high && t <= arr[high]) {
high--;
}
arr[low]=arr[high];
while(low<high && t >= arr[low]) {
low++;
}
arr[high]=arr[low];
}else {
//3.降序
while(low<high && t >= arr[high]) {
high--;
}
arr[low]=arr[high];
while(low<high && t <= arr[low]) {
low++;
}
arr[high]=arr[low];
}
}
//4.当low=high时,跳出循环
arr[low]=t;
quickSort(flag, arr, l, low-1);
quickSort(flag, arr, low+1, h);
}
public static void main(String[] args) {
int[] arr1 = {44,41,88,46,99,56};
int[] arr2 = {77,66,4,99,2,4,57};
quickSort(true, arr1, 0, arr1.length-1);
quickSort(false, arr2, 0, arr2.length-1);
System.out.println("升序:"+Arrays.toString(arr1));
System.out.println("降序:"+Arrays.toString(arr2));
}
}
时间复杂度
最优: O(nlogn) 最差: O(n^2)
平均: O(nlogn)
空间复杂度
最优: O(logn) 最差: O(n)
ps:如有不足,期待您的指点,谢谢!