public static void execute(int[] arr,int left,int right){
// 当left大于或者等于right的时候退出递归
if(left < right){
int point = getPoint(arr,left,right);
execute(arr,left,point-1);
execute(arr,point+1,right);
}
}
/**
* @deprecated 寻找主元
* @param arr 原数组
* @param left 左边界
* @param right 右边界
* @return 主元的下标
*/
public static int getPoint(int[] arr,int left,int right){
// 假定left位置的元素为主元
int key = left;
// 主元的值
int mainKey = arr[key];
left++;
/*开始调整数的位置,使主元左边的数都小于主元,主元右边的数都大于等于主元*/
while (left < right){
// 从左边查找大于等于主元的数
while (left < right && arr[left] < mainKey){
left++;
}
// 从右边开始查找小于主元的数
while (left < right && arr[right] >= mainKey){
right--;
}
// 交换位置
if(left < right){
int temp = arr[left];
arr[left] = arr[right];
arr[right] = temp;
}
}
// 从右往左寻找第一个小于mainKey的下标,将找到的值作为本趟真正的主元
while (key < right && arr[right] >= mainKey){
right--;
}
// 找到第一个小于mainKey的下标
if(mainKey > arr[right]){
arr[key] = arr[right];
arr[right] = mainKey;
return right;
}else {//没有找到
return key;
}
}
时间复杂度平均情况 | 时间复杂度最优情况 | 时间复杂度最差情况 | 空间复杂度 | 稳定性 |
---|
O(nlogn) | O(nlogn) | O(n^2) | O(nlogn) | 不稳定 |