现在开始看些经典的算法,就先研究了下递归与分治算法!
分治算法思想:分治法的基本思想是将一个规模为n的问题分解为k个规模较小的子问题,这些子问题互相独立且与原问题相同。递归地解这些子问题,然后将各子问题的解合并得到原问题的解。
首先看了合并排序,用的是递归的分治算法,(非递归和自然分治以后会继续写)。下面附上源代码:
</pre><pre name="code" class="cpp">#include <iostream>
#include <cstring>
using namespace std;
const int length = 50;
/**
合并排序的递归方式
**/
//合并
bool merge(int *arr,int *arrylist,int begin,int mid,int end)
{
int i = begin;
int j = mid+1;
int k = begin;
//进行合并,因为每一边已经是个排序好的序列
while(i<=mid && j<=end){
if(arr[i]<=arr[j])
{
arrylist[k++] = arr[i++];
}
else
{
arrylist[k++] = arr[j++];
}
}
//表示左边的剩余的都是比较大的
while(i<=mid)
{
arrylist[k++] = arr[i++];
}
//表示右边的剩余的都是比较大的
while(j<=end)
{
arrylist[k++] = arr[j++];
}
//把arrylist拷贝给arry
memcpy(arr+begin,arrylist+begin,(end-begin+1)*sizeof(arr[0]));
return true;
}
// 把序列不停的平分,直到子序列的begin和end相等
bool MergeSort(int *arr,int *arrylist,int begin,int end)
{
//当序列的begin与end为一个时返回
if(begin==end)
{
return true;
}
int mid = (begin+end)/2;
//把序列平分排序,分治思想,把大的任务分成较小的任务
MergeSort(arr,arrylist,begin,mid);
MergeSort(arr,arrylist,mid+1,end);
//排序好后,进行合并
merge(arr,arrylist,begin,mid,end);
return true;
}
//合并排序需要一些额外的内存空间
bool preMergeSort(int *arr,int begin,int end)
{
//申请需要的内存空间
int *arrylist = new int[end-begin+1];
//合并排序
MergeSort(arr,arrylist,begin,end);
return true;
}
int main()
{
int arr[length],temp,i=0,end;
while(cin>>temp)
{
arr[i++] = temp;
}
end = i-1;
preMergeSort(arr,0,end);
for(i=0;i<=end;i++)
{
cout<<arr[i]<<" ";
}
return 0;
}