归并排序和快速排序的核心思想都是分治法。
由于本人并不是专于研究算法的,所以对于这两种算法的复杂度分析不进行研究与探讨。
这篇文章主要讨论这两种算法的原理理解与c++的描述。
归并排序:
假如给定序列21,25,49,25,16,8,31,41,
那么我们利用分治法的思想,大问题化成规模较小的相同的子问题,将序列进行划分,8个元素,好麻烦,那么我们就排4个吧?
最简单的情况呢,1个放在哪里,就是排好的咯。
21 25 49 25 16 08 31 41
21 25 49 25| 16 08 31 41 //划分过程;
21 25 | 49 25| 16 08 | 31 41
21 | 25 | 49 25| 16 | 08 | 31 | 41
21 25 | 25 49| 08 16 | 31 41
21 25 25 49| 08 16 31 41 //归并过程;
08 16 21 25 25 31 41 49
那么接下来就是我们要根据原理写出实现的代码了。
所有的讲解都放在注释里了,思想很简单。
快速排序:
依然是上面的序列:21,25,49,25,16,8,31,41,
快速排序同样基于分治法。她的基本思想是任意取待排序列中的一个元素作为一个基准,依据这个基准的大小,将序列分为左右两个子序列,
左侧的都比她小,右侧的都比她大或者和她一样大。基准放在这两个子列中间就好了。重复上述方法,直到所有的元都待在它该待得位置
就好了。
[21 25 49 25 16 08 31 41] //(p)所指即为基准;
//p的个数相当于递归到子序列的深度;p->21;
[08 16] 21 [25 49 25 31 41]
//pp1->08,pp2->25;
08 [16] 21 25 [49 25 31 41]
//ppp1=16,ppp2=49;
08 16 21 25 [41 25 31] 49
//pppp=41;
08 16 21 25 [31 25] 41 49
//ppppp=31;
08 16 21 25 25* 31 41 49
放代码:
这就是我对这两种基于分治法的排序方法的理解,如有错误,那一定是个意外哦。