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