JAVA算法系列 快速排序

java算法系列之排序

手写快排

首先说一下什么是快排,比冒泡效率要高,快排的基本思路是首先找到一个基准元素,比如数组中最左边的那个位置,作为基准元素key,之后在最左边和最右边设立两个哨兵,ij
之后,开始按住左哨兵(i),让右哨兵(j)往左走(j--),找到比key小的元素后,按住右哨兵(j),开始让左哨兵往右走(i++),直到找到比key大的元素,让i和j脚下的值互换,此时完成第一趟快排,之后开始按照这个思路进行while循环,跳出循环的条件很简单,就是当两个哨兵碰头了,就跳出循环,此时,左边一块永远比key小,右边一块始终比key大!然后来个递归,对左右这两块进行一次快排,就o了。


package com.rsc.sort;

/**
 * 人生中第一个快排
 * 
 * @author 
 * @落雨 http://ae6623.cn
 */
public class QuickSort {

    
    public static void quickSort(int[] a, int l, int r) {
        int i = l;
        int j = r;

        if (l > r) {
            return;
        }

        int key = a[l]; // 基准位key
        while (i != j) {
            // 先从右边的哨兵开始找
            while (i < j && a[j] >= key) {
                j--; // 直到找到了 a[j]<key的一个值,就停下来,得到了下标j
            }
            // 然后开始从左向右寻找

            while (i < j && a[i] <= key) {
                i++;
            }

            if (i < j) {
                key = a[j];// 将key和a[j]交换
                a[i] = a[j];// 将a[j]和a[i]互换,此时完成a[i]的赋值
                a[j] = key;// 成功将a[j]和a[i]互换
            }
        }

        // 现在将key归位
        a[l] = a[i];
        a[i] = key;
        System.out.println("基准位:" + key);

        // 递归处理左右两块
        quickSort(a, l, i - 1); // 从左边开始一直到i-1,也就是基准位的前一位的排序
        quickSort(a, i + 1, r); // 从i+1开始到最右边

        for (int k : a) {
            System.out.print(k + " ");
        }
        System.out.println();

    }

    public static void main(String[] args) {
        int[] array = { 2, 1, 5, 4, 3, 7, 6 };
        quickSort(array, 0, array.length - 1);

    }

}

打印结果如下:

基准位:2
基准位:1
1 2 5 4 3 7 6 
基准位:5
基准位:3
基准位:4
1 2 3 4 5 7 6 
1 2 3 4 5 7 6 
基准位:7
基准位:6
1 2 3 4 5 6 7 
1 2 3 4 5 6 7 
1 2 3 4 5 6 7 
1 2 3 4 5 6 7 
上一篇:算法与数据结构大系列 - NO.1 - 插入排序


下一篇:实操《深入浅出React和Redux》第二期--Flux