数据结构学习总结算法设计---排序


hi,你好啊 今天是11月4号 大概这一次真的要结束了。但学习的道路是不会停下的哦。

(1)若一组记录的排序码为(46, 79,56,38,40,84),则利用
快速排序的方法,以第一个记录为基准得到的一次划分结果为
( )。
A.38,40,46,56,79,84 B.40,38,46,79,
56,84
C.40,38,46,56,79,84 D.40,38,46,84,
56,79
答案:C
分析:这个题主要考察快速排序的方法 记得将中心点放置于监视哨 从后面找比中心点小的 ,后面空出位置后记得从前面找比中心点大的数字。
(11)若一组记录的排序码为(46,79,56,38,40,84),则利用
堆排序的方法建立的初始堆为( )。
A.79,46,56,38,40,84 B.84,79,56,38,
40,46
C.84,79,56,46,40,38 D.84,56,79,40,
46,38
答案:B
分析:按照排序码建立一棵树 然后建立大根堆或者小根堆进行排序
(1)设待排序的关键字序列为{12,2,16,30,28,10,16*,20,
6,18},试分别写出使用以下排序方法,每趟排序结束后关键字序
列的状态。
① 直接插入排序
② 折半插入排序 [mid=(low+high)/2]
③ 希尔排序(增量选取 5,3,1)
④ 冒泡排序
⑤ 快速排序 (重点掌握 注意掌握方法)
⑥ 简单选择排序
⑦ 堆排序
⑧ 二路归并排序
(3)对输入文件(101,51,19,61,3,71,31,17,19,100,
55,20,9,30,50,6,90);当 k=6 时,使用置换-选择算法,写
出建立的初始败者树及生成的初始归并段

初始归并段:R1:3,19,31,51,61,71,100,101
R2:9,17,19,20,30,50,55,90
R3:6

算法

(1)试以单链表为存储结构,实现简单选择排序算法。

 `[算法描述]:
  void LinkedListSelectSort(LinkedList head)
      //本算法一趟找出一个关键字最小的结点,其数据和当前结点进行交换;若要交换指针,则须记下//当前结点和最小结点的前驱指针
  p=head->next; 
  while(p!=null)
    {q=p->next; r=p; //设 r 是指向关键字最小的结点的指针
    while (q!=null)
    {if(q->data<r->data) r=q;
  q:=q->next;
    }
   if(r!=p) r->data<-->p->data;
     p=p->next;}`

(2)有 n 个记录存储在带头结点的双向链表中,现用双向冒泡排序
法对其按上升序进行排序,请写出这种排序的算法。(注:双向冒泡
排序即相邻两趟排序向相反方向冒泡)。

  `typedef struct node
     { ElemType data;
       struct node *prior,*next;
     }node,*DLinkedList;
  void TwoWayBubbleSort(DLinkedList la)
  //对存储在带头结点的双向链表 la 中的元素进行双向起泡排
  序。
  {int exchange=1; // 设标记
  DLinkedList p,temp,tail;
  head=la //双向链表头,算法过程中是向下起泡的开
  始结点
  tail=null; //双向链表尾,算法过程中是向上起泡的开
  始结点
  while (exchange)
  {p=head->next; //p 是工作指针,指向当前结点
  exchange=0; //假定本趟无交换
  while (p->next!=tail) // 向下(右)起泡,一趟有一最大
  元素沉底
   if (p->data>p->next->data) //交换两结点指针,涉及 6 条
  链
  {temp=p->next; exchange=1;//有交换
  p->next=temp->next;temp->next->prior=p //先将结点从链表
  上摘下
  temp->next=p; p->prior->next=temp; //将 temp 插到 p
  结点前
  temp->prior=p->prior; p->prior=temp;
  }
    else p=p->next; //无交换,指针后移
    tail=p; //准备向上起泡
    p=tail->prior;
  while (exchange && p->prior!=head) 
  //向上(左)起泡,一趟有一最小元素冒出
   if (p->data<p->prior->data) //交换两结点指
  针,涉及 6 条链
  {temp=p->prior; exchange=1; //有交换
  p->prior=temp->prior;temp->prior->next=p;
  //先将 temp 结点从链表上摘下
  temp->prior=p; p->next->prior=temp; //将 temp 插到 p 结点
  后(右)
  temp->next=p->next; p->next=temp;
  }
   else p=p->prior; //无交换,指针前移
   head=p; //准备向下起泡
  }// while (exchange)
  } //算法结束`

(5)借助于快速排序的算法思想,在一组无序的记录中查找给定关
键字值等于 key 的记录。设此组记录存放于数组 r[l..n]中。若查
找成功,则输出该记录在 r 数组中的位置及其值,否则显示“not
find”信息。请简要说明算法思想并编写算法。
分析:把待查记录看作枢轴,先由后向前依次比较,若小于枢
轴,则从前向后,直到查找成功返回其位置或失败返回 0 为止

 `int index (RecType R[],int l,h,datatype key)
  {int i=l,j=h;
   while (i<j)
      { while (i<=j && R[j].key>key) j--;
        if (R[j].key==key) return j;
        while (i<=j && R[i].key<key) i++;
        if (R[i].key==key) return i;
      }
    cout<<“Not find”; return 0;
 }//index `
现在时22时54分 你今天过的开心吗?如果不开心记得早点睡觉 明天醒来又是活力满满的一天哦 我也要勇敢的奔赴考研的战场了。加油


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM