算法描述:
快速排序是找出一个元素(理论上可以随便找一个)作为基准(pivot),然后对数组进行分区操作,使基准左边元素的值都不大于基准值,基准右边的元素值 都不小于基准值,如此作为基准的元素调整到排序后的正确位置。递归快速排序,将其他n-1个元素也调整到排序后的正确位置。最后每个元素都是在排序后的正 确位置,排序完成。所以快速排序算法的核心算法是分区操作,即如何调整基准的位置以及调整返回基准的最终位置以便分治递归。
算法分析:
T(N)=O(1) + O(N) + 2T(N/2)
根据master公式
时间复杂度:O(N*logN)),但常数项较大,所以实际使用中很快
空间复杂度:O(logN)
常规方法无法做到稳定性。
举例说明:
一开始less指针在第一个元素之前的位置,more指针在最后一个元素的位置。 L指针在第一个元素的位置。
依次把当前元素与最后一个元素比较,若小于它,交换小于区后一位和当前指针指向的值,小于区向右扩大一位,当前指针指向下一位置;若大于它,交换大于区前一位与当前指针指向的值;若等于它,当前指针指向下一元素。
code:
public class QuickSort {
public static void quickSort(int[] arr) {
if (arr == null || arr.length < 2) {
return;
}
quickSort(arr, 0, arr.length - 1);
}
public static void quickSort(int[] arr, int L, int r) {
if (L < r) {
swap(arr, L + (int) (Math.random() * (r - L + 1)), r); //避免最坏情况
int[] p = patition(arr, L, r);
quickSort(arr, L, p[0] - 1);
quickSort(arr, p[1] + 1, r);
}
}
public static int[] patition(int[] arr, int L, int r) {
int less = L - 1;
int more = r;
while (L < more) {
if (arr[L] < arr[r]) {
swap(arr, ++less, L++);
} else if (arr[L] > arr[r]) {
swap(arr, --more, L);
} else {
L++;
}
}
swap(arr, more, r);
return new int[]{less + 1, more};
}
public static void swap(int[] arr, int i, int j) {
int tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}
public static void printArray(int[] arr) {
if (arr == null) {
return;
}
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + " ");
}
}
public static void main(String[] args) {
int[] arr = new int[] {65,24,1,5,765,32,87,0};
quickSort(arr);
printArray(arr);
}
}