在看快排之前先明白一点:
快排是基于划分来排的,那么什么是划分?
划分就是把数据分为两组,使所有比关键字大的在一边,所有比关键字小的在一边
划分演示:
先取一个关键值(这里是随便取的)
从左往右扫描(这里图少了几张)
左边的数应该比关键值小,右边要比关键值大,记住这条规则
在左边找到一个比关键值大的
然后左边的扫描停止,从右边找一个比关键值小的
两两交换,然后循环扫描直到保持左边都比关键值小,右边都比关键值大
左右扫描的游标重合的地方就是划分的分割点
一次划分结束
然后快排就是再次基础上不断的划分,直到全部有序
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这个编辑器,上传过一张图片后,就再也传不了图片了,坑