快速排序

在看快排之前先明白一点:
快排是基于划分来排的,那么什么是划分?
划分就是把数据分为两组,使所有比关键字大的在一边,所有比关键字小的在一边

划分演示:
这里写图片描述

先取一个关键值(这里是随便取的)
这里写图片描述
从左往右扫描(这里图少了几张)
左边的数应该比关键值小,右边要比关键值大,记住这条规则
这里写图片描述
在左边找到一个比关键值大的
这里写图片描述
然后左边的扫描停止,从右边找一个比关键值小的
这里写图片描述
这里写图片描述
两两交换,然后循环扫描直到保持左边都比关键值小,右边都比关键值大这里写图片描述
左右扫描的游标重合的地方就是划分的分割点
这里写图片描述
一次划分结束
然后快排就是再次基础上不断的划分,直到全部有序

package sort;

import org.junit.Test;

public class QuickSort
{
    private int [] arr = { 88 , 33 , 56 , 66 , 99 , 11 , 77 } ;

    //将指定范围数据(left->right) 按照指定值划分(value),小的放左,大的放右
    public int divide ( int left , int right , int value )
    {
        int l = left - 1 ;
        int r = right + 1 ;

        while ( true )
        {
            //循环结束代表在左边找到比关键字大的数,准备交换
            while ( l < right && arr [++l] < value );

            //循环结束代表在右边找到比关键字小的数,准备交换
            while ( r > left  && arr [--r] > value ) ;  

            //如果l r重合代表整个数组数据都被循环过了,跳出循环
            if ( l >= r )
            {
                break ;
            }

            //交换数据
            int temp = arr [l] ;
            arr [l] = arr [r] ;
            arr [r] = temp ;
        }

        return l ;//返回重合点
    }

    public void sort ()
    {
        recsort ( 0 , arr.length - 1) ;
    }

    //使用递归来反复划分,最后变为有序
    public void recsort ( int left , int right )
    {

        if ( right - left <= 0 )
        {
            return ;
        }

        int value = arr [right] ;//关键值
        int p = divide ( left , right , value ) ;//p 分割点下标

        recsort ( left , p - 1 ) ;
        recsort ( p , right ) ;
    }

    //遍历
    public void display ()
    {
        for ( int i = 0 ; i < arr.length ; ++ i )
        {
            System.out.print ( arr [i] + " " );
        }
        System.out.println ();
    }

}

不得不吐槽一下csdn这个编辑器,上传过一张图片后,就再也传不了图片了,坑

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值