快速排序
来源:互联网 发布:淘宝电工工具袋 编辑:程序博客网 时间: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这个编辑器,上传过一张图片后,就再也传不了图片了,坑