快速排序

快速排序

快速排序是先给一个数归位

  1. 找一个基准值(比基准值大的在右边,比基准值小的放左遍),一般选择左边第一个元素作为基准值,两个索引分别指向两端的数。
  2. 第一次循环索引从后往前比较,如果比基准值小则交换位置,如果没有继续比较下一个,直到找到比基准值小的值才交换。
  3. 当找到一个比基准值小的值交换了位置之后,索引又从前往后开始比较,比基准值大的交换位置。
  4. 如果有比基准值大的,交换位置,如果没有继续比较下一个,直到找到第一个比基准值大的值才交换。
  5. 反复比较。指向基准值的索引一直不动。
  6. 直到从前往后的索引>从后往前比较的索引,结束第一次循环,此时对于基准值来说就已经归位了,左边(无序)的都比它小,右边(无序)的都比它大。
  7. 然后递归调用。

模拟图

    // 第一次36<88,不交换位置
        {36, 2, 12, 100, 98, 23, 54, 13, 77, 88}
         ↑                                   ↑
    // 第二次36<77,不交换位置
        {36, 2, 12, 100, 98, 23, 54, 13, 77, 88};
         ↑                               ↑
    // 第三次36>13,交换位置
        {13, 2, 12, 100, 98, 23, 54, 36, 77, 88};
         ↑                            ↑
    // 第四次2<31,不交换位置 
        {13, 2, 12, 100, 98, 23, 54, 31, 77, 88};
             ↑                       ↑  
    // 第五次12<31,不交换位置 
        {13, 2, 12, 100, 98, 23, 54, 31, 77, 88};
                ↑                    ↑  
    // 第六次100>31,交换位置 
        {13, 2, 12, 31, 98, 23, 54, 100, 77, 88};
                    ↑                ↑    
    // 第七次31<54,不交换位置 
        {13, 2, 12, 31, 98, 23, 54, 100, 77, 88};
                    ↑           ↑  
    // 第八次31>23,交换位置 
        {13, 2, 12, 23, 98, 31, 54, 100, 77, 88};
                    ↑       ↑  
    // 第九次98>23,交换位置 
        {13, 2, 12, 23, 31, 98, 54, 100, 77, 88};
                        ↑   ↑  

代码

package com.common;

import java.util.Arrays;

/**
 * 快速排序
 * @date : 2020-12-03 08:47
 **/
public class AppTest {

    public static void quickSort(int[]a,int start,int end) {
        int t;
        int left = start;//0
        int right = end; //9
        
        while (left < right ) {
            //基准值小,右边下标左移
            while (a[left] < a[right]) {
                right--;
            }
            //
            if (left < right) {
                t = a[left];
                a[left] = a[right];
                a[right] = t;
                left++;
            }

            while (a[left] < a[right] && left < right) {
                left++;
            }
            if (left < right) {
                t = a[left];
                a[left] = a[right];
                a[right] = t;
                right--;
            }
        }
        //左
        if (left>start){
            quickSort(a, start, left-1);
        }
         //右
        if (left<end){
            quickSort(a, left+1, end);
        }
    }

    public static void main(String[] args) {
        int[] a = {36, 2, 12, 100, 98, 23, 54, 13, 77, 88};
        System.out.println(Arrays.toString(a));
        quickSort(a, 0, a.length-1);
        System.out.println(Arrays.toString(a));

    }
}

在这里插入图片描述
溜了溜了!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值