【分治策略】归并排序算法总结

归并排序思想

归并排序的思想很简单,拿到一个无序的序列,先从序列的中间位置将其切分成两个子序列,然后对两个子序列递归地进行归并排序,最后,将排好序的子序列合并成一个完整的有序序列。归并排序算法的伪代码如下:

序列seq = [s1, s1, s3, ..., sn]
归并排序:
  将seq切分成两个部分seq1, seq2;
  对seq1进行归并排序;
  对seq2进行归并排序;
  把seq1和seq1合并称为一个完整的序列seq;

数组归并排序

对数组进行归并排序,需要开一个临时数组以便合并时可以使用。在普通的数组归并排序实现中,空间开销可能会达到O(nlogn)或者更差的复杂度,这里介绍另外一种方式,在O(n)的空间开销内完成数组的归并排序。C++代码实现如下所示,以下面代码为例,在归并排序时,开了两个数组arr和tmp,通过不断交换两个数组来实现空间的高效利用。假如归并当前这一层需要将元素存在arr中,那么下一层就反过来将元素存在tmp中,就这样不断轮替,就不用再每一层的合并操作里都开临时数组去辅助实现。

#include <iostream>
using namespace std;

class SortingArray {
public:
  SortingArray(const int& size): size(size) {
    entry = new int[size];
  }
  ~SortingArray() {
    if (entry != NULL) {
      delete [] entry;
    }
  }
  int operator[](int i) const { return entry[i%size]; }
  int& operator[](int i) { return entry[i%size]; }
  void sort() {
    int* tmp = new 
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值