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