新增两中排序算法实现,测试ok,当做我今天的作业吧!
template <typename T>
void printArr(T* a,size_t sz,string sort_type)
{
cout<<sort_type<<" ";
for(auto i=0;i<sz;++i)
cout<<a[i]<<" ";
cout<<endl;
}
template <typename T>
void shell_st(T*a,size_t sz)
{
auto gap=sz/2;
while(gap>=1)
{
for(auto i=gap;i<sz;++i)
{
T tmp=a[i];
auto j=0;
for(j=i-gap;j>=0&&tmp<a[j];j-=gap)
a[j+gap]=a[j];
a[j+gap]=tmp;
}
gap/=2;
}
printArr(a,sz,"shell");
}
template <typename T>
void Merge(T*a,int s,int m,int e)
{
T *t=new T[e-s+1];
int iL=s,iR=m+1,iT=0;
while(iL<=m&&iR<=e)
{
if(a[iL]<=a[iR])
t[iT++]=a[iL++];
else
t[iT++]=a[iR++];
}
while(iL<=m)
t[iT++]=a[iL++];
while(iR<=e)
t[iT++]=a[iR++];
for(int i=0;i<iT;++i)
a[s+i]=t[i];
}
template <typename T>
void MergeSort(T*a,int s,int e)
{
if(s>=e||a==nullptr)
return;
int m=(s+e)/2;
MergeSort(a,s,m);
MergeSort(a,m+1,e);
Merge(a,s,m,e);
}
int main() {
int a[]{ 5,6,1,8,3,4,9,7,2,3,45,6,77,88,45,23};
auto end=sizeof (a)/sizeof (int)-1;
cout << "归并排序前:";
for (int i = 0; i < end+1; i++)
cout << a[i] << ' ';
cout << endl;
shell_st(a,end+1);
MergeSort(a,0,end);
// merge_sort(a, end+1);
cout << "归并排序后:";
for (int i = 0; i < end+1; i++)
cout << a[i] << ' ';
cout << endl;
}