最近一直在看排序,看到网课老师讲快排时,感觉好像很简单的样子,直到自己手动敲起了代码,才发现很多地方都有所欠缺,相信很多博友对于快排都不陌生,但是感觉这玩意离自己还是有那么一层纱,如果屏幕前的你也有这种感觉,那么接下来请随我一起揭开这一层薄纱,来一睹它的芳容. ----作者注
进阶排序的一般步骤(快排/归并):
1.问题的分解
2.子问题的递归
3.子问题解的合并
这里简单且草率地说一下快排和归并的联系(如果说的有问题,还望大牛批评指正):快排和归并是一对难兄难弟,快排重点是问题的分解,也就是第一部分Partiiton()上下了大功夫,到了第三部分,就没它什么事了,因为前两部分就已经把数组排序做好了.
归并排序不一样,归并排序在问题的分解上面很随意,取索引中间值作为划分依据,分为左数组和右数组,但是在问题的合并上下了狠功夫,归并排序以后再讲,这里主要讲的还是快排(没办法,因为快排优秀啊~时间复杂度和空间复杂度可接受程度更高,应用更广泛)
基本代码:
//最常见的双向移动指针partition
int Partition(vector<int>& A, int begin, int end) {
//问题的划分
int record = A[begin];
int i, j;
i = begin, j = end;
while (i <= j) {
while (A[i] <= record && i <= j) {
++i;
}
while (A[j] >= record && i <= j) {
--j;
}
if (i <= j) {
swap(A[i], A[j]);
}
}
swap(A[begin], A[j]);
return j;
}
void Quick_Sort(vector<int>& A, int begin, int end)
{
if (begin < end) {
int q = Partition(A, begin, end); //问题的分解与解决
Quick_Sort(A, begin, q - 1)