您的位置:首页 > 其它

8)排序④排序算法之归并排序

2015-12-04 10:32 453 查看
#include "iostream"
#include "vector"
#include "time.h"
#include "iomanip"
using namespace std;

#define num 25
typedef int type;//type类型为int

/*
*将非降数组A,B,中的元素
*/
void merge(vector<type>A,vector<type>B,vector<type>&C,int flags)
{
int ia =0,ib=0,ic=0;
if(flags==1)//升序
{
while(ia<A.size()&&ib<B.size())
{
if(A[ia]<=B[ib])
{
C.push_back(A[ia++]);
}else C.push_back(B[ib++]);
}
}else if(flags==0){//降序
while(ia<A.size()&&ib<B.size())
{
if(A[ia]>=B[ib])
{
C.push_back(A[ia++]);
}else C.push_back(B[ib++]);
}
}
while(ia<A.size())
{
C.push_back(A[ia++]);
}

while(ib<B.size())
{
C.push_back(B[ib++]);
}

}

/*
*将n个长度的子表归并为m个子表(n为偶数,m=n/2;否,m=n/2+1)
*/
int Merge_sort(vector<vector<int>>array,int n,vector<vector<int>>&mid,int &count,int flags)
{
int i;
if(n%2==0)
{
count = n/2;
for(i=0;i<n-1;i=i+2)
{
merge(array[i],array[i+1],mid[i/2],flags);
}
}else{
count = n/2 +1;
vector<int>temp;
temp.clear();
for(i=0;i<n-2;i=i+2)
{
merge(array[i],array[i+1],mid[i/2],flags);
}
merge(array[n-1],temp,mid[count-1],flags);
}
return 0;
}

void Sort_Merge()
{
int i,j,flags;
time_t start,end;
vector<int>array;
cout<<"Initialize Array:"<<endl;
for(i=0;i<num;i++)//随机产生数组中的数据
{
array.push_back(rand()%1000);
cout<<setw(5)<<array[i]<<" ";
if((i+1)%10==0)cout<<endl;
}
cout<<endl;
cout<<"please inout flags[flags:1,升序;0降序]:";
cin>>flags;
start = clock();
vector<vector<int>>arraymid(array.size());
for(i=0;i<array.size();i++)//初始化num个子表
{
arraymid[i].push_back(array[i]);
}
vector<vector<int>>mid(num);//存放num个子表归并后的子表
int count =arraymid.size();//用于记录起始子表数目
int countmid = count;//用于记录归并后子表的数目
while(count!=1)
{
for(i=0;i<countmid;i++)
{
mid[i].clear();//清空待存放归并后子表的数组
}
Merge_sort(arraymid,count,mid,countmid,flags);//归并

for(i=0;i<count;i++)//将归并后的子表赋给arraymid,然后继续归并
{
arraymid[i].clear();
for(j=0;j<mid[i].size();j++)
{
arraymid[i].push_back(mid[i][j]);
}
}
count = countmid;//子表数目更新为归并后的子表数目
}
end = clock();
cout<<"The Merge_Sorted Array:"<<endl;
//输出最终排序后的的结果
for(i=0;i<count;i++)
{
for(j=0;j<mid[i].size();j++)
{
cout<<setw(5)<<mid[i][j]<<" ";
if((j+1)%10==0)cout<<endl;
}
}
cout<<endl;

cout<<"performnace time:";
cout<<(double)(end - start )/1000<<"Seconds"<<endl;
}

int main()
{
Sort_Merge();
return 0;
}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: