归并排序和快速排序是时间复杂度比较优秀的排序算法中比较常用的两个。本文将重点介绍归并排序的思想,并给出归并排序的常用代码模版。
归并排序的算法思想
和快速排序的想法是类似的,他们都使用了分治的基本思想。归并排序的主要的思想是,对于一个长序列,我们先找到序列的中间点,先递归的排序左右两个短序列,然后利用双指针法合并左右两个有序的序列。思想上还是很好理解的。
时间复杂度分析:由于每一段序列每次都会被分裂为两段,知道序列中只剩下一个元素为止,所以递归的层数为logn层,每一层我们都会利用双指针法完整的扫描整个序列,所以总体的时间复杂度为o(nlogn),是比较优秀的
归并排序的代码实现
int a[N], tmp[N]; //a为待排序的目标数组,tmp为辅助数组
void merge_sort(int l , int r)
{
if (l >= r) return;
int i = l, mid = l + r >> 1, j = mid + 1 ,k = l;
merge_sort(l, mid), merge_sort(j, r); //先递归左右两个子区间
while (i <= mid && j <= r)
{
if (a[i] <= a[j]) tmp[k++] = a[i++];
else tmp[k++] = a[j++];
}
while (i <= mid) tmp[k++] = a[i++];
while (j <= r) tmp[k++] = a[j++];
for (int i = l; i <= r; i++) a[i] = tmp[i];
}