快速排序(是对冒泡排序的一次改进)
阈值情况考虑
- 会碰到 交换数据的时候,交换到中间的值,意即为会车
- 如果碰到 left = = 中间值 则需要 r–
- 如果碰到 right = =中间值 则需要 l++
- 防止栈溢出 当遍历到 left == right值的时候,需要将其错开继续遍历下去
- 需进行左递归和右递归
算法解析
算法演示
public static void sort(int[] arr, int left, int right) {
// 定义左下标
int l = left;
// 定义右下标
int r = right;
// 定义中轴
int pivot = arr[(left + right) / 2];
// 定义临时变量
int temp = 0;
// 当左下标 小于 右下标的时候 一直遍历
while (l < r) {
// 一直遍历直到找到 比 中轴值大的数字
while (arr[l] < pivot) {
l += 1;
}
// 一直遍历直到找到 比 中轴值小的数字
while (arr[r] > pivot) {
r -= 1;
}
// 如果左下标 大于 右下标 说明已经遍历完毕了 需要结束遍历
if (l >= r) {
break;
}
// 交换
temp = arr[l];
arr[l] = arr[r];
arr[r] = temp;
// 交换完毕 如果该值 等于中轴值 则需 将右下标往前推进
if (arr[l] == pivot) {
r -= 1;
}
// 交换完毕 如何该值 等于中轴值 则需 将左下标往后推进
if (arr[r] == pivot) {
l += 1;
}
}
// 防止栈溢出
if (l == r) {
l += 1;
r -= 1;
}
// 如果一直满足如下条件 , 则向左遍历
if (left < r) {
sort(arr, left, r);
}
// 如果一直满足如下条件 , 则向右遍历
if (right > l) {
sort(arr, l, right);
}
}
算法测试
public static void main(String[] args) {
int [] arr = {23,4,5,12,3,54,23,54,4};
sort(arr,0,arr.length - 1);
System.out.println(Arrays.toString(arr));
}