【算法设计与分析】 递归合并排序 递归与分治
【问题描述】
使用递归合并排序算法对若干整数进行排序
【输入形式】
在屏幕上输入若干整数,各数间都以一个空格分隔。
【输出形式】
输出递归函数调用的次数和最终从小到大排序好的结果。
【样例输入】
48 38 65 97 76 13 27
【样例输出】
13
13 27 38 48 65 76 97
【样例说明】
输入:7个整数,以空格分隔。
输出:第一行输出递归函数调用的次数,第二行输出最终从小到大排序好的结果,整数间以空格分隔。
C++代码:
#include <iostream>
#include <cstdio>
#include <sstream>
using namespace std;
int a[1005],b[1005];
void merge(int a[],int b[],int left,int mid,int right)
{
int i=left,j=mid+1,k=left;
while(i<=mid&&j<=right)
{
if(a[i]<a[j])
b[k++]=a[i++];
else
b[k++]=a[j++];
}
while(i<=mid)
b[k++]=a[i++];
while(j<=right)
b[k++]=a[j++];
}
void copy(int a[],int b[],int left,int right)
{
for(int i=left;i<=right;i++)
a[i]=b[i];
}
void merge_Sort(int a[],int left,int right,int &time)
{
time++;
if(left<right)
{
int mid=left+(right-left)/2;
merge_Sort(a,left,mid,time);
merge_Sort(a,mid+1,right,time);
merge(a,b,left,mid,right);//合并到新数组
copy(a,b,left,right);//复制到原数组
}
}
int main()
{
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
stringstream ss;
string s;
getline(cin,s);
ss<<s;
int t,n=0,time=0;
while(ss>>t)
a[n++]=t;;
merge_Sort(a,0,n-1,time);
cout<<time<<endl;
for(int i=0;i<n;i++)
cout<<a[i]<<" ";
cout<<endl;
return 0;
}
Python代码:
def merge(a,b):
c=[]
i=j=0
while i<len(a) and j<len(b):
if a[i]<b[j]:
c.append(a[i])
i+=1
else:
c.append(b[j])
j+=1
while i<len(a):
c.append(a[i])
i+=1
while j<len(b):
c.append(b[j])
j+=1
return c
def merge_sort(list):
global time #在函数中修改全局变量的值
time+=1
if len(list)<=1:
return list
middle=len(list)//2 #注意Python中整除用“//”
left=merge_sort(list[:middle])
right=merge_sort(list[middle:])
return merge(left,right)
list=[int(i) for i in input().split()]
time=0
list=merge_sort(list)
print(time)
len=len(list)
for i in range(len):
print(list[i],end=" ")