二路合并排序算法

来源:互联网 发布:java将int转换成date 编辑:程序博客网 时间:2024/05/22 09:03

//分治排序
//分解:将n个元素分解成n/2个子序列
//解决:用合并排序法递归的排序个子序列
//合并:合并两个已排序好的子序列

//本人水平有限,此代码指供参考,如有错误请赐教,我会及时更新文章。
#include <iostream>
using namespace std;
const int num=16;
//合并已经排序好的数据,
void merge(int *p,int n1,int n2,int n3)//1 1 2  //0 2 4
{
 //当合并数据下标为1,1,2是,要合并的数据元素为第一个和第二个。
 int len=(n2==n1)?1:((n3-n1+1)/2);
 int *A=new int[len];
 int *B=new int[len];
 for (int z=0;z<len;z++)
 {
  A[z]=p[n1+z-1];//A,B保存临时要合并的数据
  B[z]=p[n2+z];
 }
    int i=0,j=0;
 int n11=n1-1;
 if (n1<=n2&&n2<n3)
 {
  //取出A,B中小的元素写到p
  while (i!=len&&j!=len)
  {
   if (A[i]>B[j])
   {
    p[n11++]=B[j++];
   }
   else if (A[i]<B[j])
   {
    p[n11++]=A[i++];
   }
   else
   {
    p[n11++]=A[i++];
    p[n11++]=B[j++];
   }
   if (i==len&&j!=len)
   {
    while (j!=len)
    {
     p[n11++]=B[j++];
    }
   }
   if (j==len&&i!=len)
   {
    while (i!=len)
    {
     p[n11++]=A[i++];
    }
   }
  }

 }
}
//递归分解子序列
void merge_sort(int *p,int first,int last)

 if (last>first)
 {
  int temp=(first+last)/2;
  merge_sort(p,first,temp);
  merge_sort(p,temp+1,last);
  merge(p,first,temp,last);
 }  
}
void main()
{
 int iData[num]={9,1,13,5,2,8,10,7,15,6,11,12,16,4,14,3};
 std::cout<<"原数据为:     ";
 for (int i=0;i<sizeof(iData)/4;i++)
 {
  std::cout<<iData[i]<<" ";
 }
 merge_sort(iData,1,sizeof(iData)/4);
 std::cout<<endl<<"排序后数据为: ";
 for (int j=0;j<sizeof(iData)/sizeof(int);j++)
 {
  std::cout<<iData[j]<<" ";
 }
 std::cout<<endl;
}

原创粉丝点击