算法设计题
㈠ 算法设计与分析习题谁会做
这个是利用分治思想来解
考点是快排
可以用二分法对原数组进行排序
快排(QuickSort)是一种基于分治思想的二分排序法。对于一段序列,我们先
选出一个划分元素,然后用线性的时间复杂度将大于和小于划分元素的元素
移动到划分元素的两边,再由划分元素处将序列拆分为两部分,分别进一步
处理。显然这里划分元素的选择决定了拆分序列的平均程度。
因为算法是二分的,每段序列的处理是线性的,易知时间复杂度为O(nlgn)。
可是假设每一次选择的划分元素都是序列里最大或最小的,那么拆分的时间
复杂度也会变成线性的,所以快排在最坏情况下的时间复杂度为O(N^2)。
㈡ 求解数据结构的算法设计题
想法:先将两表合并,然后再倒转……或者在合并的时候,在每个节点的前面添加后处理的节点,然后返回最后的节点的首地址 
########################################## 
思路就这样了,没有时间写了……相信你有这实力写出来的……加油 
逐步比较,然后就将这个的next指针指向已经处理的首地址,循环下去 
等待高手写算法吧
#############################################
有时间就写了一下……
#include<stdio.h> 
typedef struct link
{
  int num;
  struct link * next; 
}LINK,*Link;
Link addlink(Link * link,int i,int where)
{
   Link tmp=(Link)malloc(sizeof(LINK)),next;
   tmp->num=i;   
   if(where==0)//after
   {  (*link)->next=tmp; 
   tmp->next=NULL;
  }
  if(where==1)//before
  {        
   tmp->next=(*link);
  }
  return tmp;
 }
void initfirst(Link * link)
{
   (*link)=(Link)malloc(sizeof(LINK));
   (*link)->num=0;
   (*link)->next=NULL;
 }
Link initlink()
{
   Link  tmp, tmp1,tmp2;
   initfirst(&tmp);
   int i=0,num=0,num1=0;
   printf("\n请输入数字的个数,然后输入各个数字,请安递增排列:");
  scanf("%d",&num); 
  tmp1=tmp;
      for(;i<num;i++){
          scanf("%d",&num1);
     if(i==0)
     {
     tmp->num=num1;
     continue;
    }
      tmp1=addlink(&tmp1,num1,0);     
    }
  return tmp;
   
}
void putlink(Link link)
{
   Link tmp=link;
   while(tmp!=NULL)
   {
   printf("%d->",tmp->num);
   tmp=tmp->next;
   }    
 }
 Link joinlink(Link la,Link lb)
 {
     Link tmp,tmp1,tmp2,*lc;
     initfirst(&tmp);
     tmp1=tmp;
     int i=0,min=0;
     while(la!=NULL&&lb!=NULL)
     {
     if(la->num>lb->num)
     {lc=&lb;
     min=lb->num;}
     else
     {lc=&la;
     min=la->num;
     }
       if(i==0)
     {
     tmp->num=min;
     tmp=tmp->next;
      i++;
      
    }
    else
   { tmp=addlink(&tmp,(*lc)->num,1);
       (*lc)=(*lc)->next;
    }    
    }
    while(la!=NULL)
    {
    tmp=addlink(&tmp,la->num,1);
       la=la->next;
    }
      while(lb!=NULL)
    {
    tmp=addlink(&tmp,lb->num,1);
       lb=lb->next;
    }
 tmp1=NULL;
  return tmp;  
}
int main()
{
   Link la,lb,lc;
   printf("初始化LA:");
   la=initlink();
   printf("\nLa=");putlink(la);
   printf("\n初始化LB:");
  lb= initlink();
 printf("\nLb=");
  putlink(lb);
  lc=joinlink(la,lb);
   printf("\nLc=");
 putlink(lc);
  system("pause > nul");
  return 0;
}
㈢ 求解一道算法设计题
void invert(sequenlist *p)
{
 char mid;
 int i,j;
 i=0;
    j=p->last-1;
     while(i<j)
 {
  mid=p->data[i];
        p->data[i]=p->data[j];   
  p->data[j]=mid;
     i++;j--;
 }
}
㈣ 数据结构算法设计题
某链表中最常用的操作是在最后一个元素之后插入一个元素和删除最后一个元素,则采用( )存储方式最节省运算时间. (A)...已知带头结点的单链表L中的结点是按整数值递增排列的,试写一算法,将值为x 的结点插入到表L中,使得L仍然有序
㈤ 一道数据结构的算法设计题
#include<iostream>
#include<stack>
structTreeNode
{
intval;
TreeNode*left;
TreeNode*right;
TreeNode(intx):val(x),left(NULL),right(NULL){}
};
voidmaxDepthAndNodesNum(TreeNode*root)
{
if(root==NULL)
{
std::cout<<"maxdepth:"<<0<<std::endl;
std::cout<<"nodesnum:"<<0<<std::endl;
}
intmax_depth=0,nodes_num=0;
std::deque<TreeNode*>nodes;
nodes.push_back(root);
while(!nodes.empty())
{
max_depth++;
std::size_tcount=nodes.size();
nodes_num=nodes_num+count;
for(std::size_ti=0;i!=count;++i)
{
root=nodes.front();
if(root->left!=NULL)
{
nodes.push_back(root->left);
}
if(root->right!=NULL)
{
nodes.push_back(root->right);
}
nodes.pop_front();
}
}
std::cout<<"maxdepth:"<<max_depth<<std::endl;
std::cout<<"nodesnum:"<<nodes_num<<std::endl;
}
intmain(intargc,charconst*argv[])
{
TreeNodenode1(3),node2(4),node3(6),node4(8),node5(9),node6(123),node7(10);
node1.left=&node2;
node1.right=&node3;
node2.left=&node4;
node2.right=&node5;
node4.left=&node6;
node4.right=&node7;
maxDepthAndNodesNum(&node1);
getchar();
return0;
}
㈥ 数据结构算法设计题和2个计算题(重分)
1:
至少为3
进栈:s1,s2,
s3,
s4,
s5,s6
出栈:
s2,
s3,
s4,
s6,s5,s1
栈内
元素
个数:1,2,1,2,1,2,1,2,3,2,1,0
2:
2^0+2+2^2+2^3+……+2^(h-1)=2^h-1
》》[2^h-1]<n<[2^(h+1)-1]
所以h=[log2
(n+1)]向下取整
算法设计题好久没看了,很伤脑筋
希望对你有用
㈦ 算法设计题
(再版)
 0-1背包问题
 
 0-1背包问题:给定n种物品和一个背包。项目我的体重是无线网络,它的价格是vi背包容量C. 
 
 Q:我应该如何选择装载物品的背包,使得装入背包的总价值呢? 
 
选择项目装入背包的每个项目我只有两种选择,即装入背包或不装入背包。项目i装入背包多次,不仅加载的项目我。 
 
因此,这个问题被称为0-1背包问题。 
 
?0-1解向量(X1,X2,...,XN),西安∈{0,1},1 <= I <= N。 
 
动态编程解决方案:
集0-1背包问题给定的子最优值,M(I,J),M(我,j)是第j背包容量,可选择的项目我,我+1,...,N 0-1背包问题的最优值
 
无效背包()
INT I,J; 
 
为(i = 0; I <=我+ +) 
为(J = 0 J <= JMAX; J + +)
 
 M [] [J] = 0; 
 
(i = 0; <= n; i + + )
 
为(J = 0; <= JMAX; J + +)
 
(W [I]> J)
 
米[I] [J] = M [I-1] [J]; 
 
其他
 
 M [] [J] = MAX(M [I-1] [J],M [I-1] [JW [我] + V [I]); 
 
 printf的(“%d \ N”,M [N] [C]); BR /> 
} 
 
回溯解决方案:
 
无效1背包(I)
 
 {
  BR />(>),百视通= CV 
 
其他
 
 {
 
(CW + W [I] <= C )
 {
 
 CW + = W [我]; 
 
 CV + = V [I]; 
 
背包(i +1); 
 
 CW-= W [I]; 
 
 CV-= V [I]; 
 
} 
 a> 
背包(+1); 
 
} 
 
}
