算法导论笔记一:算法设计之分治法

来源:互联网 发布:tweenmax.js 百叶窗 编辑:程序博客网 时间:2024/05/16 11:56
分治法的设计思想是利用某些算法递归的特性,将原问题分解为n个结构相似的子问题,递归解决这些子问题,在合并其结果,便得到原问题的解,代表算法为合并排序法。

    合并排序法的原理是将原序列分为两个子序列,将两个子序列分别排序后进行合并,得到一个完整的排序序列。序列分解的最终结果是含有一个元素,单个元素即可视为已排序序列。合并排序的关键步骤是两个已排序序列的合并,其代码如下。

#include <iostream>using namespace std;void merge(int *a,int p,int r,int q){  int n1=r-p+1;  int n2=q-r;  int *in1=new int[n1];  int *in2=new int[n2];  for(int i=0;i<n1;++i)  {    in1[i]=a[i+p];  }  for(int i=0;i<n2;++i)  {    in2[i]=a[i+r+1];  }  int j=0,k=0;  for(int i=0;i<n1+n2;++i)  {    if(j>=n1)    {      a[i+p]=in2[k];      k++;    }    else if(k>=n2)    {      a[i+p]=in1[j];      j++;    }    else    {      if(in1[j]<in2[k])      {        a[i+p]=in1[j];        j++;      }      else      {        a[i+p]=in2[k];        k++;      }    }      }}void merge_sort(int *a,int p,int q){  if(p<q)  {    int r=(p+q)/2;    merge_sort(a,p,r);    merge_sort(a,r+1,q);    merge(a,p,r,q);      }}int main(){  cout<<"please input 10 numbers:"<<endl;  int a[10];  for(int i=0;i<10;++i)  {    cin>>a[i];  }  merge_sort(a,0,9);  for(int i=0;i<10;++i)    cout<<a[i]<<"\t";  cout<<endl;  return 1;}


算法分析:对于一个包含n个元素的序列进行分解,每次分解的两个子序列长度为n/2,则最终分解结果的层数为lgn,又有每一层合并算法复杂度为O(n),故整体算法复杂度为O(n*lgn)