排序算法——快速排序
快速排序同样是一种交换排序,在以往的互联网求职面试过程中,经常有面试官让手写快排的算法,这属于最基本的知识,我们一定要烂熟于心。
首先来了解一下快排是怎么一回事:假设给定了一个序列,将序列的第一个元素(或者任意元素都行)作为基准,首先从后向前扫描序列,遇到比基
准小的元素,将其交换到基准的前面;然后从前向后扫描序列,遇到比基准大的元素,将其交换到基准的后面。这样一趟排序完成后,基准的左侧都是
比其小的元素,基准右侧都是比其大的元素,也就是说这个基准将给定的序列分为了两子序列。注意,这只是一趟排序的结果,我们再对子序列运用同
样的操作,因此,可以采用递归的方式。
算法实现如下:
#include <stdlib.h> #include <stdio.h> void QuickSort(int A[], int s, int t) { int i, j, temp; i = s; j = t; if(s == t) // 递归结束的条件 return; else { temp = A[s]; // 选定的基准 while(i!=j) { while(i < j && A[j] > temp) // 从后向前扫描 j--; A[i] = A[j]; while(i < j && A[i] < temp) i++; A[j] = A[i]; } A[i] = temp; // 当i=j时循环结束,此时i为基准应该插入的位置 QuickSort(A, s, i-1); // 递归处理基准左侧的子序列 QuickSort(A, i+1, t); // 递归处理基准右侧的子序列 } }
最坏情况下,快排的时间复杂度为O(n2),空间复杂度为O(log2n)。这里需要注意的就是快排的空间复杂度,已经不是一个常量级的了,至于如何推
导,请查阅相关的资料。最后,对于算法的稳定性而言,快排是不稳定的。
这里的稳定性是指:如果给定的序列中有某两个元素相等,那么在排序前后,这两个元素的位置是否变化,如果未变化,则说明该排序算法是稳定的,
否则,是不稳定的。