现在的位置: 首页 > 综合 > 正文

分治法的数组排序

2013年07月06日 ⁄ 综合 ⁄ 共 1241字 ⁄ 字号 评论关闭

#include <iostream>
#include <stdlib.h>
#define  LEN  20
int  a[LEN];

void  merge(int ,int  ,int );

 void  mergesort(int low,int high)
  {/*利用分治思想对数组进行划分*/
   int  mid;
   if(low<high)  ///直到将每个数组分为长度为1
    {
      mid=(low+high)/2;
      mergesort(low,mid);
      mergesort(mid+1,high);
      merge(low,mid,high);  ///对两个划分数组的的合并
    }  
  }
 
 
 void  merge(int low,int mid,int high)
  {/*两数组的归并操作*/
    int b[LEN];
    int i,l,h;
    i=low;
    l=low;
    h=mid+1;
    while(l<=mid && h<=high)
    {
     if(a[l]<=a[h])   { b[i]=a[l];  l++;}
     else              {b[i]=a[h];  h++;}
    
      i++;
    }  
 
    while(l<=mid)  b[i++]=a[l++];
    while(h<=high)  b[i++]=a[h++];
  
   for(i=low;i<=high;i++)
      a[i]=b[i]; 
 
  }
 
 
 
  void print(int *a,int n)
  {
    int i;
    for(i=0;i<n;i++)
    cout<<a[i]<<"  "; 
  }
 
 
 
 

int main(int argc, char *argv[])
{
 int  n,i,s;
 cout<<"请输入数组元素个数:"<<endl;
 cin>>n;
 cout<<"请输入元素:"<<endl;
 for(i=0;i<n;i++)
   cin>>a[i];
  
   print(a,n);
  
   cout<<endl;
  
   mergesort(0,n-1);
  
   print(a,n);
 
  system("PAUSE"); 
  return 0;
}

分治法:分而治之,在这个程序里,它把一个数组作为一个整体慢慢划分,直到每个元素作为一个

长度为1 的数组再进行合并。当数组共有元素N个,2^K=N,则该程序中的递归会进行K次,时间复

度为O(nlogn),但由于在合并时采用一个辅助数组因而占用空间大,故该算法并不令人十分满

意。最近上课上的很紧,每次课下来感觉是接触到不少,只是不知道为什么,当时上课总感觉那些

经典算法都懂了,但当真正把它们变成自己的程序时总会出现这样或那样的问题,还是觉得把书本

拿出来的好,可能写的太少,懂得也太少。慢慢从编程现好好体会那些算法的用法及怎么实现的。

想到没搞定的就还有好多问题,就那矩阵相乘的动态规划还存在问题,只待慢慢解决了……

抱歉!评论已关闭.