快速排序
一.概念
快速排序(Quicksort)是对冒泡排序的一种改进。快速排序由C. A. R. Hoare在1962年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
二.排序分析
快速排序的基本思想:
1、先从数列中取出一个数作为基准数。
2、从两端开始“探测”。先从右往左找一个小于基准数的数,再从左往右找一个大于基准数的数,然后交换他们,然后继续探测。
3、当左右下标重合的时候,交换基准数和当前下标数,比如当前左右下标相等的数为k,则相当于把数列进行分区,左分区为[0,k-1],右分区为[k+1,n]。
4、重复上面的过程,完成排序。
待排序数组 :
第一步:以最右边的6为基准点
第二步:从左边开始找比6大的数,很显然是8
第三步:从右边开始找比6小的数,很明显是4
第四步:交换8和4的位子
第五步:继续开始从左边找比6大的数,找到9
第六步:从右边开始找比6小的数,当左右下标重合时
第七步:交换重合位子数值和基准数的位子
第八步:两个分区重复上面的过程,直到结束
三.时间复杂度和空间复杂度
快速排序的平均时间复杂度也是:O(nlogn),空间复杂度O(logn)。
四.快速排序动图
五.Java代码实现
/** * 快速排序 */ public class QuickSort { public static void main(String[] args) { int[] arrays = {4,7,6,5,3,2,8,1,9}; int length = arrays.length; new QuickSort().quickSort(arrays,0,length-1); for (int array : arrays) { System.out.println(array); } } public void quickSort(int[] array, int start, int end) { if(start >= end){ return; } int index = getIndex(array, start, end); quickSort(array, start, index-1); quickSort(array, index + 1, end); } private int getIndex(int[] array, int start, int end) { int temp; int pivot = start; int i = start; int j = end; while (i != j) { if (array[j] > array[pivot]) { j--; } else { if (array[i] <= array[pivot]) { i++; } else { temp = array[i]; array[i] = array[j]; array[j] = temp; j--; } } } temp = array[i]; array[i] = array[pivot]; array[pivot] = temp; return i; } }
附录:算法动态图:https://www.cs.usfca.edu/~galles/visualization/