Java算法-快速排序

快速排序双指针法主要流程:

  1. 取基准值
  2. 大于等于基准值的,保留在右边
  3. 小于等于基准值的,保留在左边
  4. 左右非法值交换
  5. 基准值归位
  6. 分别递归排序左右部分
import java.util.Arrays;

/**
 * 快速排序
 *
 **/
public class QuickSorter {

    public static void main(String[] args) {
        int[] data = {2, 3, 5, 4, 1, 2};
        quickSort(data);
        // [1, 2, 2, 3, 4, 5]
        System.out.println(Arrays.toString(data));
    }

    private static void quickSort(int[] data) {
        if (data == null || data.length == 0) {
            return;
        }
        partition(data, 0, data.length - 1);
    }

    private static void partition(int[] data, int low, int high) {
        if (low >= high) {
            return;
        }
        int base = data[low];
        // 双指针
        int runLeft = low;
        int runRight = high;
        while (runLeft < runRight) {
            // 大于等于基准值的,保留在右边
            while (data[runRight] >= base && runLeft < runRight) {
                runRight--;
            }
            // 小于等于基准值的,保留在左边
            while (data[runLeft] <= base && runLeft < runRight) {
                runLeft++;
            }
            // 左右非法值交换
            if (runLeft < runRight) {
                swap(data, runLeft, runRight);
            }
        }
        // 基准值归位
        swap(data, low, runLeft);
        partition(data, low, runLeft - 1);
        partition(data, runLeft + 1, high);
    }

    private static void swap(int[] data, int a, int b) {
        int temp = data[a];
        data[a] = data[b];
        data[b] = temp;
    }
}

你可能感兴趣的:(Java,算法)