Java排序算法之快速排序

来源:互联网 发布:禁止安装任何软件方法 编辑:程序博客网 时间:2024/05/25 21:32

快速排序思想

按照a[lo] 的值v切分,指针i和j相遇时主循环退出;
a[i]小于v时,i+1
a[j]大于v时,j-1
交换a[i], a[j] 保证 i 左侧均小于等于v,j右侧均大于等于等于v。
当指针相遇时交换a[lo], a[hi], 切分结束。切分值留在a[j] 中。

速度快,非稳定排序
时间复杂度是nlogn,空间复杂度logn

快速排序算法的关键在于:
先在数组中选择一个数字,接下来把数组中的数字分为两部分,比选择的数字小的数字移动数组的左边,比选择的数字大的数字移到数组的右边

Java实现

public class Sort {    public static void main(String[] args) {        int[] arr = { 5, 1, 9, 3, 7, 4, 8, 6, 2 };        System.out.println("排序之前:");        for (int i = 0; i < arr.length; i++) {            System.out.print(arr[i] + " ");        }        sort(arr);        System.out.println();        System.out.println("排序之后:");        for (int i = 0; i < arr.length; i++) {            System.out.print(arr[i] + " ");        }    }    /**     * 快速排序     * @param a     */    public static void sort(int[] a) {        sort(a, 0, a.length - 1);    }    private static void sort(int[] a, int lo, int hi) {        if (hi <= lo)              return;        int j = partition(a, lo, hi); // 切分,排序的核心        sort(a, lo, j - 1); // 左半部分排序        sort(a, j + 1, hi); // 右半部分排序    }    private static int partition(int[] a, int lo, int hi) {        int i = lo, j = hi + 1;        int v = a[lo];        while (true) {            while (a[++i] < v) // 找到左侧大于v的第一个值的下标i                if (i == hi)                    break;            while (a[--j] > v) // 找到右侧小于v的第一个值的下标j                if (j == lo)                    break;            if (i >= j)        // i,j两指针相遇时主循环退出                break;            exch(a, i, j);     // 交换a[i],a[j]        }        exch(a, lo, j);        // 切分结束,切分值留在a[j]        return j;    }    private static void exch(int[] a, int lo, int hi) {        int temp = a[lo];        a[lo] = a[hi];        a[hi] = temp;    }}

这里写图片描述

0 0
原创粉丝点击