快速排序之JAVA使用姿势

在编写快速排序的代码时,我们需要先了解一下快速排序的原理。

什么叫快速排序?

通过一次排序把需要排序的数据分割成两个独立的部分,其中一部的所有数据都比另外一部要小,通过此种排序方法再对之前分割后的两部分数据分别进行快速排序,整个排序的过程中使用递归方式进行,最终将所有需要排序的数据变成有序序列。

理解好上面的原理后再来看java代码的实现将很好理解这其中的奥妙:

/**
 * 将数组的某一段元素进行划分,小的在左边,大的在右边
 */
public static int divide(int[] a, int start, int end){
    //每次都以最右边的元素作为基准值
    int base = a[end];
    //start一旦等于end,就说明左右两个指针合并到了同一位置,可以结束此轮循环。
    while(start < end){
        while(start < end && a[start] <= base)
            //从左边开始遍历,如果比基准值小,就继续向右走
            start++;
        //上面的while循环结束时,就说明当前的a[start]的值比基准值大,应与基准值进行交换
        if(start < end){
            //交换
            int temp = a[start];
            a[start] = a[end];
            a[end] = temp;
            //交换后,此时的那个被调换的值也同时调到了正确的位置(基准值右边),因此右边也要同时向前移动一位
            end--;
        }
        while(start < end && a[end] >= base)
            //从右边开始遍历,如果比基准值大,就继续向左走
            end--;
        //上面的while循环结束时,就说明当前的a[end]的值比基准值小,应与基准值进行交换
        if(start < end){
            //交换
            int temp = a[start];
            a[start] = a[end];
            a[end] = temp;
            //交换后,此时的那个被调换的值也同时调到了正确的位置(基准值左边),因此左边也要同时向后移动一位
            start++;
        }

    }
    //这里返回start或者end皆可,此时的startend都为基准值所在的位置
    return end;
}


/**
 * 排序
 */
public static void sort(int[] a, int start, int end){
    if(start > end){
        //如果只有一个元素,就不用再排下去了
        return;
    }
    else{
        //如果不止一个元素,继续划分两边递归排序下去
        int partition = divide(a, start, end);
        sort(a, start, partition-1);
        sort(a, partition+1, end);
    }

}

使用姿势:

int[] array = {1,3,4,5,11,14,2,6,19,99};
sort(array,0,array.length -1);
for(int a :array){
    System.out.println(a+" ");
}


最终打印的结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值