网上各种大神的快速排序思想其实都一样的 但是实现方法的代码各有各的特点 有的人竟然能一行代码做了n件事情 跟别人的思路完全吻合其实也有难度 所以我把我的快速排序实现方法贴出来
public void quicksort(int[] x,int low,int high){
if(low>=high){
return;
}
int what = getMiddle(x,low,high);
quicksort(x,0,what-1);
quicksort(x,what+1,high);
}
分割函数:
public int getMiddle(int[] x,int low,int high){
//假设第一个元素是分割左右的元素
int key = x[low];
//此分段数组第一个需要和分割元素比较的位置
int i = low+1;
//此分段数组最后一个需要和分割元素比较的位置
int j = high;
while (true){
while (true){
//如果碰到比key大的元素 直接跳出循环 此时已经记录下了 这个元素的索引
if(x[i]>key){
break;
}else {
//如果碰到比key小的元素 不管它 索引+1 继续查找
i++;
//越界判断
if(i>=j){
break;
}
}
}
while (true) {
//如果碰到比key小的元素 直接跳出循环 此时已经记录下了 这个元素的索引
if(x[j]<key){
break;
}else {
//如果碰到比key大的元素 不管它 索引-1 继续查找
j--;
if(j<=i){
break;
}
}
}
if(i>=j){
break;
}
//交换大小值
swap(x,i,j);
}
//把分割元素放在他应该在的位置
swap(x,low,j);
return j;
}
重新优化了一下思维 并写上了注释 !!!
public static int getMiddle(int[] x,int low,int high){
//记录一个标准值 我们一般就记为第一个元素
int target = x[low];
//这个循环 是为了跳出来的时候 low==high 此时把target 赋予 x[low]
while (low<high){
//如果扫描到的值大于等于基准数据就让high减1(因为大于基准数据 是正确的 继续往下找 )
while (low<high&&x[high]>=target){
high--;
}
//如果扫描到的值小于等于基准数据 那就是不正常的 把x[high] 这个错误的值 赋予 x[low] 相当于把小值 往前放
x[low] = x[high];
//如果扫描到的值小于等于基准数据就让low加1(因为小于基准数据 是正确的 继续往下找 )
while (low<high&&x[low]<=target){
low++;
}
//如果扫描到的值大于等于基准数据 那就是不正常的 把x[low] 这个错误的值 赋予 x[high] 相当于把大值 往后放
x[high] = x[low];
}
//此时 low 正好 等于 high 把target 替换上
x[low] = target;
return low;
}