快速排序-java语言版

336 阅读2分钟

快速排序是对冒泡排序的一种改进。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一 部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序 过程可以递归进行,以此达到整个数据变成有序序列。

排序原理:
    1、首先设定一个分界值,通过该分界值将数组分成左右两部分。
    2、将大于或等于分界值的数据放到到数组右边,小于分界值的数据放到数组的左边。
    3、重复上述过程,通过递归将左侧部分排好序后,再递归排好右侧部分的顺序。当 左侧和右侧两个部分的数据排完
    序后,整个数组的排序也就完成了。

-- 原理图:

快速排序原理图.png

-- API设计

快速排序API设计.png

-- 切分原理:

1、找一个基准值,用两个指针分别指向数组的头部和尾部。
2、先从尾部向头部开始搜索一个比基准值小的元素,搜索到即停止,并记录指针的位置。
3、再从头部向尾部开始搜索一个比基准值大的元素,搜索到即停止,并记录指针的位置。
4、交换当前左边指针位置和右边指针位置的元素。
5、重复2,3,4步骤,直到左边指针大于右边指针停止。

-- 切分原理图:

切分原理图.png

-- 代码:

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

    // 对数组a中的元素进行排序
    public static void sort(Comparable[] a) {
        int lo = 0;
        int hi = a.length - 1;
        sort(a,lo,hi);
    }

    // 对数组a中lo到hi的元素进行排序
    public static  void sort(Comparable[] a,int lo,int hi) {
        if(hi <= lo) {
            return;
        }

        // 对数组a中lo到hi之间的元素进行切分
        int p = partition(a,lo,hi);

        // 对左子组进行排序
        sort(a,lo,p - 1);
        // 对右子组进行排序
        sort(a,p + 1,hi);
    }

    // 对数组中lo到hi的元素进行切分
    private static int partition(Comparable[] a,int lo,int hi) {
        Comparable key = a[lo];     // 将分组中最左边的元素定位基准值
        int left = lo;              // 定义一个左侧指针,初始化指向最左侧的元素
        int right = hi + 1;         // 定义一个右侧指针,初始化指向右侧元素的下一个

        // 进行切分
        while(true) {
            // 从右往左扫描找到一个比基准值小的元素
            while(less(key,a[--right])) {
                if(right == lo) {
                    break;      // 扫描到最左侧无需扫描
                }
            }
            // 从左往右扫描找到哟个比基准值大的元素
            while(less(a[++left],key)) {
                if(left == hi) {
                    break;      // 扫描到最左侧无需扫描
                }
            }
            // 如果两个指针相遇跳出循环
            if(left >= right) {
                break;
            }else {
                // 否则交换两个元素的值
                exch(a,left,right);
            }
        }
        // 最后交换right处与基准值处的索引
        exch(a,lo,right);
        // right就是切分线
        return  right;
    }
    //数组元素i和j交换位置
    private static void exch(Comparable[] a, int i, int j) {
        Comparable t = a[i];
        a[i] = a[j];
        a[j] = t;
    }

    // 比较v元素是否小于w元素
    private static boolean less(Comparable v, Comparable w) {
        return v.compareTo(w) < 0;
    }
}

-- 测试代码:

public class QuickTest {
    public static void main(String[] args) throws Exception {
        Integer[] arr = {6, 1, 2, 7, 9, 3, 4, 5, 8};
        Quick.sort(arr);
        System.out.println(Arrays.toString(arr));
    }
}

-- 运行效果图:

快速排序运行效果.png

@ 以上内容属于个人笔记