通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。(从后往前找小的往前放,然后从前往后找大的往后放,交替进行,直到 i == j )
快排在完全无序的情况下效果最好,时间复杂度为O(nlogn),在有序情况下效果最差,时间复杂度为O(n^2)
/**
* @author pzz
* @date 2022/8/24
* 快速排序(双边循环排序)
*/
public class QuickSort {
public static void main(String[] args) {
int[] a = {5, 3, 7, 2, 9, 8, 1, 4};
System.out.println(Arrays.toString(a));
quick(a, 0, a.length - 1);
}
private static void quick(int[] a, int l, int r){
//当左指针大于等于右指针时结束循环
if(l >= r){
return;
}
int p = partition(a,l,r);
//左边区域
quick(a,l,p - 1);
//右边区域
quick(a,p + 1,r);
}
//遍历区域内的元素
private static int partition(int[] a, int l, int r){
//每个区域的第一个元素为【基准点元素】
int pv = a[l];
int i = l;
int j = r;
while (i < j){
//j 从右往左找小的
while(i < j && a[j] > pv){
j--;
}
//i 从左往右找大的
while(i < j && a[i] <= pv){
i++;
}
//交换元素
swap(a, i, j);
}
//将基准点元素与J点的元素进行交换
swap(a, l, j);
System.out.println(Arrays.toString(a) + " j=" + j);
return j;
}
public static void swap(int[] a,int n,int m){
int temp = a[n];
a[n] = a[m];
a[m] = temp;
}
}
结束!!!
你有没有为将来打算过呢?