学算法最好的办法是写算法。所以接下的一段时间每天会抽出时间学习下《算法导论》并用c/c++语言实现算法。
分冶法实现合并排序,代码清单:
- /*
- 2008.9.10
- by tianzhihen
- */
- #include <iostream>
- using namespace std;
- void Merge(int *ia,int p, int q, int r);
- void Merge_Sort(int *ia,int p,int r);
- int main()
- {
- int ia[9]={0,5,2,4,7,1,3,2,6};
- Merge_Sort(ia,1,8);
- for(int i=1;i<=8;i++)
- cout << ia[i] << " ";
- cout<< endl;
- return(1);
- }
- void Merge_Sort(int *ia,int p,int r)
- {/*递归过程*/
- if (p<r)
- {
- int q=(p+r)/2;
- Merge_Sort(ia,p,q);
- Merge_Sort(ia,q+1,r);
- Merge(ia,p,q,r);
- }
- }
- void Merge(int *ia, int p,int q, int r)
- {/*排序过程*/
- int n1=q-p+1;
- int n2=r-q;
- int *L= new int[n1+2];
- int *R= new int[n2+2];
- for (int i=1;i<=n1;i++)
- L[i]=ia[p+i-1];
- for (int j=1;j<=n2;j++)
- R[j]=ia[q+j];
- L[n1+1]=10000000; //构造无穷大值
- R[n2+1]=10000000;
- i=1;
- j=1;
- for (int k=p;k<=r;k++) //排序
- {
- if(L[i]<=R[j])
- {
- ia[k]=L[i];
- i=i+1;
- }
- else
- {
- ia[k]=R[j];
- j=j+1;
- }
- }
- delete [] L;
- L=NULL;
- delete [] R;
- R=NULL;
- }