1.怎样用7次比较完成5个元素排序?假设5个元素为a,b,c,d,e,给出该算法的伪代码,加以必要的注释。
输入 a,b,c,d,e
1.3次
if(a<b&&c<d){
if(b<d){
then a<b<d && c<d
triple[3]={a,b,d};
} else{
then c<d<b && a<b
triple[3]={c,d,b};
}
2.2次
then binary_insert(e,triple[3]);
3.2次
if(a<b<d<e)
triple[3]={a,b.d};
then binary_insert(c.triple[3]);
}
则总计次数为3+2+2=7次
2.计算排序数组大小n为2的整数次幂时,自底向上合并排序算法的最少和最多元素比较次数。需要给出计算过程。
1.次数最少
令2^n = T,则n=log2(T)
T/2+(T/4)*2+(T/8)*4+……+T/(2^n)*2^(n-1)
=nlog2(n)/2
2.次数最多
令2^n = T,则n = log2(T)
(T-1)+(T/2-1)*2+(T/4-1)*4+……+(T/2^n-1)*2^n
=(n+1)T-(2^(n+1)-1)
=Tlog2(T)+T-2T+1
=Tlog2(T)-T+1
3.二进制数转换
int num;
cin>>num;
stack<int>s;
while(num){s.push(num%2);num/=2;)}
while(!s.empty()){
cout<<s.top();
s.pop();
}
伪代码说明 输入num 初始化栈s while(num){ //num不为0 s.push(num%2); num/=2; } while(!s){ 输出栈顶元素,并出栈 }
基本思路是利用栈的特性将十进制数转为二进制后的每一位数存入栈中,并按先入后出的顺序出栈,则输出流最终的结果就是所要的二进制数。
|