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 `