快速排序
快速排序是一种分治的排序算法。它将一个数组分成两个子数组,将两部分独立的排序。快速排序和归并排序是互补的:归并排序将数组分成两个子数组分别排序,并将有序的子数组归并以将整个数组排序;而快速排序将数组排序的方式则是当两个子数组都有序时整个数组也就自然有序了。在归并排序中,递归调用发生在处理整个数组之前,而快速排序中,递归调用发生在处理整个数组之后。
快速排序算法是最快的通用排序算法,大部分情况下,可以直接选择快速排序

如上图所示,将第一个元素K作为切分元素,使得左边的元素均不大于K,右边的元素均不小于K,这样如果左右两边都有序了,那么整个数组也就有序了。
这就是快速排序的基本原理,如果看过我前一篇关于归并排序的博客,那么很容易理解,这里需要用到递归。
先上代码:
public void quickSort(Integer[] a,Integer low,Integer high) {
? ? ? ? if(low >= high)
? ? ? ? ? ? return;
? ? ? ? Integer j = partion(a,low,high);
? ? ? ? quickSort(a,low,j);
? ? ? ? quickSort(a,j+1,high);
? ? }
这是递归调用的代码,我们先不管partion函数,现在只需要知道这个函数返回切分元素的下表,如上面图示的那样,返回K元素所在的下标,那么就将数组分成两个数组:
说的有些乱,但是其实还是很好理解的。下面给出partion函数的代码:
public Integer partion(Integer[] a,Integer low,Integer high) {
? ? ? ? Integer i = low;
? ? ? ? Integer j = high + 1;
? ? ? ? while(true) {
? ? ? ? ? ? //在循环中最好使用++i,如果使用i++,则会导致很多逻辑错误,i++是在循环结束时(即运行到大括号时)才会++,这也是为什么前面需要使用high+1
