Java实现快速排序以及原理


快速排序

快速排序,是选取数组中的一个随机值作为参考值,使其左边的元素小于参考值,右边的元素大于参数值。
一般的情况下我们选取的是数组的中间索引所在的值作为参考值的。

循环(左边索引 < 右边索引)

sort(arr,left,right), 循环使用索引为 lt = left, rt = right;

  1. 先判断左边索引所在值,小于参考值,则左边索引加1。否则停止比较。
  2. 先判断右边索引所在值,大于参考值,则右边索引减1。否则停止比较。
  3. 判断左边索引是否大于等于右边索引,如果是则退出循环,否则执行第4步。
  4. 在到达这里左边索引所在值大于等于参考值,且右边索引所在值小于等于参考值,交互两边索引的值。
  5. 为了防止数组中存在多个相同值,而出现死循环。(在第4步如果交互的值都等于参考值,则不进行第5步,则下左边索引和右边索引不变,在下次执行第4步的时候,还是一样的操作,而出现死循环)需要移动左边或右边索引。如果左边索引所在值和参考值相同,则右边索引减1。如果右边索引所在值和参考值相同,则左边索引值加1。

排序之后小于参考值的在rt的左边,大于参考值的在lt的右边

排序后的数组排序

  1. 判断lt是否等于rt,已防止出现栈溢出(出现ltrt的时候,说明排序后mv在最左边或最右边,这是ltleft或lt==right 在执行sort(arr,left,rt)或sort(arr,lt,right)和进入方法sort(arr,left,right) 值是一致的)。是则lt加1,rt减1。
  2. 判断left与排序后的rt比较,如果小于则执行(sort(arr,left,rt)
  3. 判断right与排序后的lt比较,如果大于则执行sort(arr,lt,right);

快速排序代码实现

代码示例,以及相应位置说明

package com.study.algorithm;

import java.util.Arrays;

public class QuickSort {


    public static void main(String[] args){

        int[] arr = {-1,3,5,10,100,-20,30,50,2,3,5,7,3};
        sort(arr,0,arr.length -1);
        System.out.println(Arrays.toString(arr));

    }

    public static void sort(int[] arr, int left, int right){

        int mid = (left + right) / 2;

        int lt = left;
        int rt = right;

        int mv = arr[mid];

        int tmp = 0;
        while (lt < rt){

            while (arr[lt] < mv){
                lt++;
            }

            while (arr[rt] > mv){
                rt --;
            }
            //判断以防止数组越界
            if(lt >= rt){
                break;
            }
            //执行到这 说明左边值大于等于 mv。 且右边值小于等于 mv
            tmp = arr[lt];
            arr[lt] = arr[rt];
            arr[rt] = tmp;

            //如果不做这一步,当数组中存在多个相同执行,会出现死循环
            //如 2,2,2
            if(arr[lt] == mv){
                rt --;
            }

            if(arr[rt] == mv){
                lt ++;
            }

        }
        //lt == rt的情况是,排序后,mv值在最右边,或是在最左边。会出现栈溢出
        //  arr[]     lt,rt
        //如:3,1,2    0,2
        //   3,1,2    0,1
        //   1,3,2    0,0,  执行后续操作,就会相同数据,一直入栈操作
        if(lt == rt){
            lt ++;
            rt --;
        }

        if(left < rt){
            sort(arr,left,rt);
        }
        if(right > lt){
            sort(arr,lt,right);
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值