2, 快速排序(平分移动+迭代排序)-冒泡算法的优化
- 双指针(左右指针)进行中间切分交换
- 然后使用分治思想再分别对各自的切分区域再进行相同的交换操作
快速排序思路
首先以中间一个数字为基准,把该数右侧大于该数的移至该数左侧,把该数左侧大于数的移至该数右侧。这样大于该数的数字都在右侧,小于该数的都在该数左侧。
接着再使用迭代算法, 依次对左侧的进行相同方法的移动。
接着再使用迭代算法, 依次对右侧的进行相同方法的移动。
当迭代结束,该数组数字即是有序
package im.bool.a06_sort_algrithm;
import java.util.Arrays;
/**
* @author : 不二
* @date : 2022/4/4-下午3:51
* @desc : 快速排序:
* 双指针(左右指针)进行中间切分交换,
* 然后使用分治思想再分别对各自的切分区域再进行相同的交换操作
*
* 快速排序思路
* 首先以中间一个数字为基准,把该数右侧大于该数的移至该数左侧,把该数左侧大于数的移至该数右侧。这样大于该数的数字都在右侧,小于该数的都在该数左侧。
* 接着再使用迭代算法, 依次对左侧的进行相同方法的移动。
* 接着再使用迭代算法, 依次对右侧的进行相同方法的移动。
* 当迭代结束,该数组数字即是有序
*
**/
public class a06_09_Quick_v3 {
public static void main(String[] args) {
// int[] arr = {6, 7, 8, 4, 3, 2, 1};
int[] arr = {9, -2, -1, 3, 10, 100, -3, 3, 4, 20};
quickSort(arr, 0, arr.length-1);
System.out.println(Arrays.toString(arr));
}
public static int[] quickSort(int[] arr, int left, int right) {
if(left < right) {
int midIndex = (left + right) / 2;
int midValue = arr[midIndex];
int leftPointer = left;
int rightPointer = right;
while (leftPointer < rightPointer) {
// 如果是小于,那就把指针往后移动
// 和中间值相同的数据也需要进行交换
while (arr[leftPointer] < midValue) {
leftPointer++;
}
while (arr[rightPointer] > midValue) {
rightPointer--;
}
// 如果走到这里,说明:做指针找到了一个值,右指针找到了一个值
// 如果左指针和右指针 不是 都指向 midIndex,那么就需要交换
int tmp = arr[leftPointer];
arr[leftPointer] = arr[rightPointer];
arr[rightPointer] = tmp;
// 因为和中间值相同的数据,所以如果左右两个指针的数据和中间值相同,那么必须得有一个指针跳出来
if (arr[leftPointer] == midValue && arr[rightPointer] == midValue) {
leftPointer++;
}
}
// 这个时候leftPointer == rightPointer
// 而且需要作为新的中间值进行迭代调用
quickSort(arr, left, rightPointer - 1);
quickSort(arr, leftPointer, right);
}
return arr;
}
}