package com.wlf.array;
public class QuickSort {
/*
* 快速排序 时间复杂度:O(n)-0(n²) 空间复杂度O(1),需要一个辅助空间作参考。
*
* 可以简单理解为"挖坑填数"+"分治法(递归)"
* 先取一个参考数x,比x小放其左边,反之放右边。(以x参考,相当于在x处挖了个坑,那么就必须填坑)
*
* 先由后往前找比x小的,找到后,把这个数放到x位置填坑,此时这个数原来的位置就有了一个坑
* 在由前往后找,找到比x大的,把这个数填到上个数的坑中。
* 依次循环(注意:每次循环从挖过坑的后一位开始),由后往前,挖坑填坑,再又前往后。
* 直到找到与上个数相同的数时停止,把参考数x放到这个数的位置上。
*/
void quick_sort(int s[], int l, int r)// 返回调整后基准数 l=0,r=s.length的位置 //
// (friendly)
{
if (l < r) {
// Swap(s[l], s[(l + r) / 2]); //以中间的数作为基准数的,将中间的这个数和第一个数交换
int i = l, j = r, x = s[l];
while (i < j) {
while (i < j && s[j] >= x)// 从右向左找第一个小于x的数
j--;
if (i < j)
s[i++] = s[j];
while (i < j && s[i] < x)// 从左向右找第一个大于等于x的数
i++;
if (i < j)
s[j--] = s[i];
}
s[i] = x;
// 递归调用
quick_sort(s, l, i - 1);
quick_sort(s, i + 1, r);
}
}
// //test
// public static void main(String[] args) {
// int[] array = new int[] { 123, 23, 32, 32, 4, 6, 13, 93, 33, 23, 45 };
// QuickSort a = new QuickSort();
// a.quick_sort(array, 0, 10);
// for (int i = 0; i < array.length; i++) {
// System.out.print(array[i] + " ");
//
// }
//
// }
}