/* 快速排序
* @param datas
* @param left
* 快速排序的起始位置
* @param right
* 快速排序的终止位置
* @author sunyanqiang
*/
public static void qiuckSort(int[] datas,int left,int right){
if (left < right) {
//目的在于找中间值的下标。
int middle = findMiddle(datas,left,right);
//对左一半进行快排
qiuckSort(datas, left, middle - 1);
//对右一半进行快排
qiuckSort(datas, middle + 1, right);
}else {
return;
}
}
/**
* 找中间值的下标
* @param datas
* @param left
* @param right
* @return
* @author sunyanqiang
*/
private static int findMiddle(int[] datas, int left, int right) {
//定义一些变量
int leftIndex = left;//左指针
int rightIndex = right - 1;//右指针
int temp = datas[right];//参照物
int middle = 0;//中间值的下标
while(true){
//先写个死循环,到了要跳出的时候,break。
//左指针从左往右找数据,找比参照物大的,前提是不能越界(<right - 1)
while(leftIndex < right && datas[leftIndex] <= temp){
//一直找数据
leftIndex ++;
}
//右指针从右往左找数据,找比参照物小得
while(rightIndex >= left && datas[rightIndex] >= temp){
//一直找数据
rightIndex --;
}
//判断左右指针有没有交叉
if (leftIndex < rightIndex) {
//没有交叉
//交换左右指针位置上的值
change(datas, leftIndex, rightIndex);
//继续找数据
continue;
}else {
//交叉了
middle = leftIndex;
//交换左指针位置的值和参照物的值
change(datas, leftIndex, right);
//跳出循环
break;
}
}
return middle;
}
转载请注明原文地址: https://ju.6miu.com/read-2055.html