划分数组
* partition 方法是
* 1.假设轴元素是99 82 100 86 .. . .. 108 90 120
* 指针 从左边走 从右边走 左边元素应该比轴元素99 小,右边应该比99大。
* 那么当它左边走到100时 右边走到90时 会停下来 两者交换位置
* 2.把轴元素移动中间,可以假定数组最右端元素是轴元素
*
* 3.返回轴元素的位置 方便后面的排序
*
* 4.排序是用递归的方法
* 轴的左边用 sort , 轴的右边也用 sort方法
public static int partition(long arr[],int left, int right,long point) {
int leftPtr = left - 1;
int rightPtr = right;
while(true) {
//循环,将比关键字小的留在左端
while(leftPtr < rightPtr && arr[++leftPtr] < point);
//循环,将比关键字大的留在右端
while(rightPtr > leftPtr && arr[--rightPtr] > point);
if(leftPtr >= rightPtr) {
break;
} else {
long tmp = arr[leftPtr];
arr[leftPtr] = arr[rightPtr];
arr[rightPtr] = tmp;
}
}
//将关键字和当前leftPtr所指的这一个进行交换
long tmp = arr[leftPtr];
arr[leftPtr] = arr[right];
arr[right] = tmp;
return leftPtr;
}
public static void sort(long[] arr, int left, int right) {
if(right - left <= 0) {
return;
} else {
//设置关键字
long point = arr[right];
//获得切入点,同时对数组进行划分
int partition = partition(arr, left, right, point);
//对左边的子数组进行快速排序
sort(arr,left,partition - 1);
//对右边的子数组进行快速排序
sort(arr,partition + 1, right);
}