一、概念
-
快速排序
快速排序(Quicksort)是对冒泡排序算法的一种改进。快速排序由C. A. R. Hoare在1960年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。——百度百科
简单来说,快速排序就是用基数将数组分为两部分,然后在两部分继续找基数,然后继续分……
-
归并排序
归并排序(Merge Sort)是建立在归并操作上的一种有效,稳定的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。——百度百科
归并排序呢,是先分,再合并。分分分分分,然后排一排,接着将得到的有序数列合合合合合,得到最终的有序数列。
二、不同与相同
-
不同
两种排序的方法有很大不同:快速排序是使劲分,分到最后就有序了。归并排序时先分再合,合完之后才有序。
-
相同
都是排序算法
都是建立在分治算法的基础上实现排序的。
三、代码实现
-
1.快排
我们前面说过,快排是找一个基准数,以基准数为标准找比它小的与比它大的。那么找谁为基准数呢?为了方便,我们就找第一个数吧。
那怎么实现的呢?我们先来看伪代码:每个(未排序)的部分 将第一个元素设为轴心点 存储指数 = 轴心点指数 +1 从 i=轴心点指数 +1 到 最右指数 的遍历 如果 元素[i] < 元素[轴心点] 交换(i, 存储指数); 存储指数++ 交换(轴心点, 存储指数 - 1)
那么这样一轮下来,我们就能确定第一个数的位置和其他数字的大范围了。在继续按此方式执行,就能得到排序好的序列。
没什么好说的了,那就上程序的核心代码(以从大到小为例):
void p(long long l,long long r)//排序区间 { if(l>r)//区间小于0 return; long long s=a[l]; long long i=l,j=r; while(i!=j) { while(a[j]<=s