快速排序

来源:互联网 发布:淘宝电工工具袋 编辑:程序博客网 时间:2024/05/01 00:48

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

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

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

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这个编辑器,上传过一张图片后,就再也传不了图片了,坑