基于“交换”的排序︰
根据序列中两个元素关键字的比较结果来对换这两个记录在序列中的位置。
快速排序属于交换排序的大类。
示意图:

代码:
//用第一个元素将待排序序列划分成左右两个部分
int Partition(int A[], int low, int high) {
int pivot = A[low];//第一个元素作为枢轴
while (low < high) {//用low、high搜索枢轴的最终位置
while (low < high && A[high] >= pivot) --high;
A[low] = A[high];//比枢轴小的元素移动到左端
while (low < high && A[low] <= pivot) ++low;
A[high] = A[low];//比枢轴大的元素移动到右端
}
A[low] = pivot;//枢轴元素存放到最终位置
return low;//返回存放枢轴的最终位置
}
//快速排序
void QuickSort(int A[], int low, int high) {
if (low < high) {//递归跳出的条件
int pivotpos = Partition(A, low, high); //划分
QuickSort(A, low, pivotpos - 1);//划分左子表
QuickSort(A, pivotpos + 1, high); //划分右子表
}
}
算法表现主要取决于递归深度,若每次“划分”越均匀,则递归深度越低。“划分”越不均匀,递归深度越深。
快速排序的过程就是遍历含n个结点的二叉树的过程。
即递归的层数为树的高度:最小高度=
[
l
o
g
2
n
]
+
1
[log_2n]+1
[log2n]+1,最大高度= n

每一层的QuickSort只需要处理剩余的待排序元素,时间复杂度不超过O(n)。
时间复杂度= O ( n ∗ 递归层数 ) O(n*递归层数) O(n∗递归层数)
最好空间复杂度= O ( l o g 2 n ) O(log_2n) O(log2n)
最坏空间复杂度= O ( n ) O(n) O(n)
若每一次选中的“枢轴”将待排序序列划分为均匀的两个部分,
则递归深度最小,算法效率最高。
尽量选择可以把数据中分的枢轴元素。
快速排序是所有内部排序算法中,平均性能最优的排序算法。
不稳定。