快速排序
将一个无序的数组分为两个无序的数组
其中一个数组的最大值小于等于另一个数组的最小值
两个数组各自进行排序后拼接在一起就是完整的有序的数组
1.取无序数组左右边界下标为临时指针left和right
2.获取数组中轴值arr[(left + right) / 2]
3.在left<right的循环中判断
arr[left] < 中轴值,如果为true,left+1;如果为false记录当前下标left
arr[right] > 中轴值,如果为true,right-1;如果为false记录当前下标right
如果left >= right,说明两个无序已经遍历结束,直接break
否则将左边较大的值替换右边较小的值
并且如果当前left下标所在的值等于中轴值,将交换前right的下标向左一位
如果当前right下标所在的值等于中轴值,将交换前left的下标向右一位
4.步骤3结束后,中轴值左侧的值一定小于等于中轴值
中轴值右侧的值一定大于等于中轴值
递归调用当前方法,将中轴值左右两个数组再次根据各自的中轴值细分为4个数组
不断细分后,当每个数组长度趋近于1时,这个整体的数组就一定是有序的
public static void quickSort(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++;
}
while (arr[r] > pivot) {
r--;
}
if (l >= r) {
break;
}
temp = arr[l];
arr[l] = arr[r];
arr[r] = temp;
if (arr[l] == pivot) {
r--;
}
if (arr[r] == pivot) {
l++;
}
}
if (l == r) {
l++;
r--;
}
if (left < r) {
quickSort(arr, left, r);
}
if (right > l) {
quickSort(arr, l, right);
}
}
测试
int[] arr = new int[10000];
for (int i = 0; i < 10000; i++) {
arr[i] = (int) (Math.random() * 10000);
}
long c1 = System.currentTimeMillis();
quickSort(arr, 0, arr.length - 1);
long c2 = System.currentTimeMillis() - c1;
System.out.println("总耗时:" + c2);