分治策略 归并排序

基本思想:

归并排序是一种基于分治法的排序算法,其基本思想是将一个待排序的序列递归地划分成较小的子序列,然后将这些子序列按照规则合并(归并)成一个有序序列。

具体的步骤如下:
1. 将待排序序列不断地拆分成两个子序列,直到每个子序列只包含一个元素。这个过程称为递归的划分。
2. 对于每对子序列,进行合并(归并)操作,将它们合并成一个有序的大序列。这个过程称为合并操作。
3. 重复步骤 2,直到最终只剩下一个完整的有序序列。

在合并操作中,首先需要比较两个子序列的第一个元素,将较小的元素放在新的有序序列的末尾。然后,继续比较两个子序列中的下一个元素,将较小的元素放入有序序列。依次类推,直到一个子序列中的所有元素都放入了有序序列。如果其中一个子序列的元素已经全部放入有序序列,而另一个子序列仍有剩余元素,直接将剩余元素放入有序序列的末尾。

通过不断地划分和合并操作,归并排序可以保证最终得到一个完全有序的序列。

效率分析:

在归并排序中,每一次合并操作都需要将两个有序子序列合并成一个新的有序序列。合并操作的时间复杂度为O(n),其中n表示两个子序列的长度之和。而在一次完整的归并排序中,共需要进行logn次合并操作。

因此,整个归并排序的时间复杂度可以表示为:
T(n) = 2T(n/2) + n

通过求解递归方程,可以得到时间复杂度为O(nlogn)。

在归并排序中,每一次合并操作都需要额外的空间来存储临时结果。因此,归并排序的空间复杂度为O(n),其中n表示待排序序列的长度。

归并排序是一种稳定的排序算法,不会改变相同元素之间的相对顺序。

最坏时间复杂度:O(nlogn)     平均时间复杂度:O(nlogn)         辅助空间:O(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)
        if (q[i] <= q[j]) tmp[k ++ ] = q[i ++ ];
        else tmp[k ++ ] = 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];
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值