归并排序是一种高效、稳定的排序算法,它采用分治法的策略,将问题分解为一些规模较小的相似子问题,递归解决这些子问题,然后合并其结果作为原问题的解。归并排序的核心在于如何将两个有序的数组合并成一个大的有序数组。
#include<stdio.h>
const int N = 100010;
int tmp[N];
void merge_sort(int q[], int l, int r)
{
if (l >= r)return;
int mid = l+r>> 1;
merge_sort(q, l, mid);
merge_sort(q, mid + 1, r);
int k = 0, i = l, j = mid + 1;//分成两段
while (i <= mid && j <= r)//注意右边r为下标(如n个数下标为n-1)
{
if (q[i] <= q[j])
{
tmp[k++] = q[i++];
}
else
{
tmp[k++] = q[j++];
}
//一段tmp[k++]=q[i]<=q[j]?q[i++]:q[j++];
}
//当排完两段,若还有剩下的数未接上
while (i <= mid)tmp[k++] = q[i++];
while (j <= r)tmp[k++] = q[j++];//最后重新将排好的数换给原来的数组
for (i = l, j = 0; i <= r; i++, j++)q[i] = tmp[j];
//注意为什么i为l(L的小写),函数中给的就是下标[l,r]的,tmp[],是从k=0开始,所以j=0
}
int main()
{
int nums[10] = { 9,6,3,7,5,2,4,1,8};
merge_sort(nums, 0, 9);
for (int i = 0; i <= 9; i++)
{
printf("%d ", nums[i]);
}
return 0;
}
运行结果:

算法分析
-
时间复杂度:归并排序的时间复杂度为 O(nlogn),其中 n 是数组的长度。这是因为每一层递归都需要遍历整个数组(O(n)),而递归的层数为 logn。
-
空间复杂度:归并排序需要额外的空间来存储临时数组,因此空间复杂度为 O(n)。
-
稳定性:归并排序是一种稳定的排序算法,因为合并两个数组时,相同元素的相对顺序不会改变。
2257

被折叠的 条评论
为什么被折叠?



