分治法 -- 排序

1. 原因

今天在用lua对一组数据进行排序,想起来很久没有写过算法了,工作中对于数据进行排序时都是使用STL里面的函数,比如sortqsort这些函数。忽然兴致勃勃的想写一个算法,表示自己没有完全忘记算法内容,所以选了一个比较简单的排序功能 -- 分治法排序

2. 分治算法的解题步骤

1.分治 -- 把元问题分割成相同的子问题,这步其实就是把问题的空间大小变小,比如本来要对10个数进行排序,我们把他分割成2组,每组5个进行排序(通常用递归的形式来分解问题)
2.子问题的解决: 比如上面的排序,就是把分割后的5个数进行排序
3. 合并:把子问题的结果进行合并

3. 废话不多说了,虽然代码很挫,但是先上一个。验证上面的解题步骤

// 2: 子问题解决
void merge(int a[], int l, int m, int r)
{
	int l_len = m - l + 1;
	int r_len = r - m;
	int *l_a = new int[l_len];
	memset(l_a, 0x00, l_len * sizeof(int));
	int *r_a = new int[r_len];
	memset(r_a, 0x00, r_len * sizeof(int));
	for (int i = 0; i < l_len; ++i)
	{
		l_a[i] = a[l + i];
	}
	for (int i = 0; i < r_len; ++i)
	{
		r_a[i] = a[m + i + 1];
	}

	int l_i = 0;
	int r_i = 0;
	for (int i = l; i <= r; ++i)
	{
		if(r_i >= r_len)
		{
			a[i] = l_a[l_i++];
		}
		else if (l_i >= l_len)
		{
			a[i] = r_a[r_i++];
		}
		else if (l_a[l_i] <= r_a[r_i])
		{
			a[i] = l_a[l_i++];
		}
		else
		{
			a[i] = r_a[r_i++];
		}
	}

	delete []l_a;
	delete []r_a;
}

// 1:分治
// 3:分治的结束返回其实就是子问题的合并
void mergerSort(int a[], int l, int r)
{
	if (l < r)
	{
		int m = (l + r) / 2;
		mergerSort(a, l, m);
		mergerSort(a, m + 1, r);
		merge(a, l, m, r);
	}
}

// 测试用例
int a[] = { 23, 4, 5, 43, 2 };
mergerSort(a, 0, 4);
posted @ 2016-05-26 15:43  zyh_think  阅读(514)  评论(0编辑  收藏  举报