1.动画展示
2.思路分析
快速排序(Quicksort)是对冒泡排序的一种改进。 基本思想是:通过- - 趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排
序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

3.复杂度分析
1.时间复杂度:
最坏情况就是每一次取到的元素就是数组中最小/最大的,这种情况其实就是冒泡排序了(每一次都排好一个元素的顺序)
这种情况时间复杂度就好计算了,就是冒泡排序的时间复杂度:T[n] = n (n-1) = n^2 + n;
最好情况下是O(nlog2n),推导过程如下:
(递归算法的时间复杂度公式:T[n] = aT[n/b] + f(n) )
所以*平均时间复杂度为O(nlog2n)
2. 空间复杂度:
快速排序使用的空间是O(1)的,也就是个常数级;而真正消耗空间的就是递归调用了,因为每次递归就要保持一些数据:
最优的情况下空间复杂度为:O(log2n);每一次都平分数组的情况
最差的情况下空间复杂度为:O( n );退化为冒泡排序的情况
所以平均空间复杂度为O(log2n)
4.代码实现
代码1,较容易理解,设置基准为首元素
public static void quick(int[] arr, int low, int high) {int pivot = arr[low];int i = low;int j = high;while (i < j) {while ((i < j) && arr[i] < pivot) {i++;}while ((i < j) && arr[j] > pivot) {j--;}if (arr[i] == arr[j] && (i < j)) {//有重复元素的情况i++;} else {//不是相同元素,交换两个值swap(arr, i, j);}}if (low < (i - 1)) {quick(arr, low, i - 1);}if ((j + 1) < high) {quick(arr, j + 1, high);}}
public class QuickSort {public static void main(String[] args) {int[] arr = {-9,78,0,23,-567,70, -1,900, 4561};System.out.println(Arrays.toString(arr));System.out.println("-----快速排序-----");quickSort(arr,0,arr.length-1);System.out.println(Arrays.toString(arr));}public static void quickSort(int[] arr,int left, int right) {int l = left; //左下标int r = right; //右下标//pivot 中轴值int pivot = arr[(left + right) / 2];int temp = 0; //临时变量,作为交换时使用//while循环的目的是让比pivot 值小放到左边//比pivot 值大放到右边while( l < r) {//在pivot的左边一直找,找到大于等于pivot值,才退出while( arr[l] < pivot) {l += 1;}//在pivot的右边一直找,找到小于等于pivot值,才退出while(arr[r] > pivot) {r -= 1;}//如果l >= r说明pivot 的左右两的值,已经按照左边全部是//小于等于pivot值,右边全部是大于等于pivot值if( l >= r) {break;}//交换中轴左右的值temp = arr[l];arr[l] = arr[r];arr[r] = temp;//如果交换完后,发现这个arr[l] == pivot值 相等 r--, 前移if(arr[l] == pivot) {r -= 1;}//如果交换完后,发现这个arr[r] == pivot值 相等 l++, 后移if(arr[r] == pivot) {l += 1;}}// 如果 l == r, 必须l++, r--, 否则为出现栈溢出if (l == r) {l += 1;r -= 1;}//向左递归if(left < r) {quickSort(arr, left, r);}//向右递归if(right > l) {quickSort(arr, l, right);}}}
运行截图
