java笔记2.21,快速排序

快速排序

快速排序

核心思想:

  1. 设定基数:基数可以从左或者从右边取,无序数列中任意取都可以
  2. 设定无序数列最左最右,L,R
  3. R往左找,基数>B,L往右,找A>基数,尝试,找到A>基数>B这种格式
  4. if 找到,交换AB
  5. 无论如何,继续左右偏移,直到L==R(意味着左边没有大于基数,右边没有小于基数),就算基数应所处位置
  6. 把基数替换到该位置
  7. 数列逐步有序,将基数左右序列重复以上步骤;
    例:
    子序列 (2,1)基数2,L=2,R=1;
    R<基数,R不偏移,L偏移
    RL,LR==1,与基数进行交换

下标为0,1,还含有区间
分成子序列
(0,L-1R-1)(L-1R-1,1)
(0,1-1)(1+1,1)
(0,0)(2,1)
if(L>=R)return;
没有区间了,进行返回

package Sort;

import java.util.Arrays;

// 快速排序
public class QuickSort {
    static int[]arry={60,9,2,8,7,3,6,4,5,11,20,9};
    public static void main(String[] args) {
        int l,r,m;
        m=l=0;
        r=arry.length-1;
        quick(l,r);
    }
    // 快排函数
    public static void quick(int l,int r)
    {
        int right=r;
        int left=l;
        int temp=l;
        // 左右已经没有区间了,小于是为了防止AB相邻的时候,左右同时减去
        if (r<=l)
        {
            return;
        }
        // 
        while (r!=l)
        {
        // 先右边靠左移动,找到比基数要小的数
            if (arry[temp]>arry[r])
            {
            	// 找到后再从左边找比基数要大的数
                if (arry[temp]<arry[l])
                {
                	// 两个数都找到了,A>基数>B
                	// 交换AB
                    int num=arry[r];
                    arry[r]=arry[l];
                    arry[l]=num;
                }
                else
                {
                	// 左右标的移动
                    l++;
                }
            }
            else
            {
                r--;
            }
        }
        // 如果左边没有比它大的,右边没有比它小,说明什么?
        // 123123123 5 9876,假设5是基数,是不是就可以找到5应该所在的位置?
        // 虽然左右序列都是无序,但是却找到基数应该所处的位置
        // 且由于循环交换A>基数>B,数列逐渐有序
        int num=arry[temp];
        arry[temp]=arry[l];
        arry[l]=num;
        System.out.println(Arrays.toString(arry));
        // 递归
        // ****************************************
        //  注意要给l-1和+1,这个雷我踩了一个下午才发现
        //  因为l所在的位置,已经是有序的,不需要进行排列
        //  l已经在它所应该在的位置
        // ****************************************
        quick(left,l-1);
        quick(l+1,right);
    }
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值