数据结构:归并排序(自顶向下和自底向上)递归和非递归

1.自顶向下

#include <iostream>
using namespace std;

//合并两个有序数组的操作
//索引m是第二区间的左边界
void merge(int *a, int l, int m, int r) {
	int LEFT_SZIE  = m - l;
	int RIGHT_SIZE = r - m + 1;
	int *left  = new int[LEFT_SIZE];
	int *right = new int[RIGHT_SIZE];
	for(int i=l; i<m; ++i) left[i-l] = a[i];
	for(int i=m; i<=r; ++i) right[i-m] = a[i];
	int i=0, j=0, k=l;
	while(i < LEFT_SZIE && j < RIGHT_SIZE) {
		if(left[i] < right[j]) a[k ++] = left[i ++];
		ekse a[k ++] = right[j ++];
	}
	while(i < LEFT_SIZE)  a[k ++] = left[i ++];
	while(j < RIGHT_SIZE) a[k ++] = right[j ++];


	delete[] left;
	delete[] right;
}

void _mergeSort(int *a, int l, int r) {
	if(l >= r) return;
	int m = (r - l) / 2 + l;
	_mergeSort(a, l, m);
	_mergeSort(a, m+1, r);
	merge(a, l, m+1, r);
}


void mergeSort(int *a, int n) {
	_mergeSort(a, 0, n-1);
}

int main() {
    int a[] = {4, 1, 8, 0, 3, 5, 7, 6, 2};
    int n = sizeof a/sizeof(int);

    cout << n << endl;

    mergeSort(a, n);
    for_each(a, a+n, [](int a) {cout << a << " ";}); cout << endl;
    return 0;
}

2.自底向上

//merge操作和上边是一样的
//这种实现方式参考算法四的实现
void _mergeSortBU(int *a, int n) {
	for(int sz=1; sz<n; sz+=sz) 
		//对a[i...i+sz-1]和a[i+sz....i+2*sz-1]进行归并
        /*(1)为了保证由两个归并段i+sz < n
          (2)为了保证不越界 min(i+2*sz-1, n-1)*/
		for(int i=0; i+sz<n; i+=sz+sz) 
			merge(a, i, i+sz, min(i+sz+sz-1, n-1));
}

void mergeSortBU(int *a, int n) {
	_mergeSortBU(a, n);
}

int main() {
    int a[] = {4, 1, 8, 0, 3, 5, 7, 6, 2};
    int n = sizeof a/sizeof(int);

    cout << n << endl;

    mergeSortBU(a, n);
    for_each(a, a+n, [](int a) {cout << a << " ";}); cout << endl;
    return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值