算法学习笔记之快速排序

算法学习笔记之快速排序

快速排序算法原理

  1. 以数组第一个位置上的元素为切分元素,
  2. 定义左扫描 i 和 右扫描 j,
  3. 左扫描 i 从左向右扫描,直到扫描到小于切分元素的元素停止,右扫描 j 从右向左扫描,直到扫描到大于切分元素的元素停止
  4. 左扫描和右扫描都停止,交换位置
  5. 第一轮结束后,交换 i 或者 j 与切分元素的位置,此时, i 或者 j 位置左边都是小于切分元素,右边都是大于切分元素
  6. 以切分元素为分割点,进行左边数组排序,和右边数组排序

快速排序算法 Java 的实现

package top.simba1949;

/**
 * 交换排序——快速排序算法
 *
 * 快速排序算法原理:
 *     1. 以数组第一个位置上的元素为切分元素,
 *     2. 定义左扫描 i 和  右扫描 j,
 *     3. 左扫描 i 从左向右扫描,直到扫描到小于切分元素的元素停止,右扫描 j 从右向左扫描,直到扫描到大于切分元素的元素停止
 *     4. 左扫描和右扫描都停止,交换位置
 *     5. 第一轮结束后,交换 i 或者 j 与切分元素的位置,此时, i 或者 j 位置左边都是小于切分元素,右边都是大于切分元素
 *     6. 以切分元素为分割点,进行左边数组排序,和右边数组排序
 *
 * @author SIMBA1949
 * @date 2019/6/29 7:33
 */
public class QuickSort {
    public static void main(String[] args) {
        int[] intArr = {1, 9, 90, 20, 30, 66, 34, 55, 54, 44, 66};
        quickSortImpl(intArr, 0, intArr.length - 1);
        for (int i : intArr) {
            System.out.print(i + "\t");
        }
    }

    public static void quickSortImpl(int[] arr, int low, int high){
        if (null == arr || arr.length < 2){
            return;
        }
        // 如果低位索引大于高位索引返回
        if(low >= high){
            return;
        }

        int comparableValue = arr[low];
        int i = low;
        int j = high;
        while (i < j){
            // i 从左边向右边扫描,直到扫描到大于切分元素的元素,停止
            while (i < j && comparableValue >= arr[i]){
                i++;
            }
            // j 从右边向左边扫描,直到扫描到小于切分元素的元素,停止
            while (i < j && comparableValue <= arr[j]){
                j--;
            }
            // 如果 i 和 j 都停止,需要交换位置
            int temp = arr[i];
            arr[i] = arr[j];
            arr[j] = temp;
        }
        // 数组以 i 位置为分割,左边全是小于切分元素,右边全是大于切分元素
        arr[low] = arr[i];
        arr[i] = comparableValue;
        // 对左边进行排序
        quickSortImpl(arr, 0, i - 1);
        quickSortImpl(arr, i + 1, high);
    }
}

你可能感兴趣的:(数据结构与算法)