本文翻译 极客时间|数据结构与算法。
快速排序用了分冶的思想,何为分冶,大问题化为小问题,小问题解决了,大问题也就解决了。
之前看别人代码的时候不懂,看几遍都不懂为啥要用递归,分冶一般都是用递归实现的,记住这句话。。。
怎么理解快排的分冶思想呢,比如数组:
{21,3,5,22,11,2,22,11}
我们选定数组中的一个值,一般是第一个和最后一个,然后遍历数组,将比该数小的值放左边,大的放右边,然后再分别以此递归左右两边的数组,递归完排序就排好了。
比如初始选定数组最后一个值11,
第一次递归后为{3,5,2} 11 {21,22,11,22},将11左右两个数组重复上面的步骤即可。
用公式表示:
quick_sort(q…r) = quick_sort(q,p-1)+quick_sort(p+1…r);终止条件q>=r;
思路很简单,如何确定p呢,以第一次递归来说就是如何确定11的位置,很明显,11左边数组有多少个数就代表了11所在的位置。
上代码吧:
private static void quikSort(int[] a, int q, int r) {
if (q>= r){
return;
}
int k = 0;
//以数组的最后一个值为基准
int p = a[r];
for (int i = q;i<=r;i++){
// a[i] 比最后一个数小的时候需要将其放到左边,交换a[k]和a[i]很巧妙
if (a[i]<p){
// 交换a[k] 和 a[i]的值
int temp = a[i];
a[i] = a[q+k];
a[q+k] = temp;
k++;
}
}
int temp = a[r];
a[r] = a[q+k];
a[q+k] = temp;
quikSort(a,q,q+k-1);
quikSort(a,q+k+1,r);
}