快速排序

92 阅读1分钟
import java.util.Arrays;

/**
 * 快速排序(递归挖坑法)
 * 个人理解:1.使用挖坑法,队列基准值为第一个元素值
 *  2.第一次使用挖坑法,遍历完之后,基准值位于start=end位置,
 *  基准值左侧值小于基准值,右侧大于基准值,然后对子数组进行递归挖坑排序
 *  3.时间复杂度:最好情况O(nlogn),最坏情况O(n²)
 *  4.空间复杂度为 O(logn)~ O(n)
 *  5.稳定性,发生跳跃式交换,不稳定
 */
public class SortTest {

    public static void main(String[] args) {
        int[] arr = {70, 12, 82, 43, 99, 23, 38, 53, 22};

        quickSort(arr, 0, arr.length-1);
        Arrays.stream(arr).forEach(a->System.out.print(a+" "));
    }

    public static void quickSort(int[] arr, int start, int end) {
        if (start >= end) {
            return;
        }
        //保存元素的首尾位置,用于递归
        int targetStart = start;
        int targetEnd = end;
        //挖坑法寻找基准值位置
        int temp = arr[start];
        while (start < end) {
            while (arr[end] > temp && end > start) {
                end--;
            }
            arr[start] = arr[end];
            while (arr[start] < temp && end > start) {
                start++;
            }
            arr[end] = arr[start];
        }
        arr[start] = temp;
        //递归左右队列
        quickSort(arr, targetStart, start-1);
        quickSort(arr, start+1, targetEnd);
    }
}