清华大学课程讲义-数据结构答案9[1]文档格式.doc
- 文档编号:14911625
- 上传时间:2022-10-25
- 格式:DOC
- 页数:7
- 大小:214KB
清华大学课程讲义-数据结构答案9[1]文档格式.doc
《清华大学课程讲义-数据结构答案9[1]文档格式.doc》由会员分享,可在线阅读,更多相关《清华大学课程讲义-数据结构答案9[1]文档格式.doc(7页珍藏版)》请在冰豆网上搜索。
675740381113344875919 如9向最终方向移动
679 574038111334487519 如13向相反方向移动
679115740381319344875如13向最终方向移动
679111357403819344875如34向相反方向移动
679111319574038344875
679111319345740384875
67911131934
9-4试修改起泡排序算法,在正反两个方向交替进行扫描,即第一趟把关键码最大的对象放到序列的最后,第二趟把关键码最小的对象放到序列的最前面。
如此反复进行。
template<
classType>
voiddataList<
Type>
:
:
shake_Sort(){
//奇数趟对表Vector从前向后,比较相邻的关键码,遇到逆序即交换,直到把参加比较关键码序列
//中最大的关键码移到序列尾部。
偶数趟从后向前,比较相邻的关键码,遇到逆序即交换,直到把
//参加比较关键码序列中最小的关键码移到序列前端。
inti=1,j;
intexchange;
while(i<
CurrentSize){ //起泡排序趟数不超过n-1
exchange=0;
//假定元素未交换
for(j=CurrentSize-i;
j>
=i;
j--) //逆向起泡
if(Vector[j-1]>
Vector[j]){ //发生逆序
Swap(Vector[j-1],Vector[j]);
//交换,最小关键码放在Vector[i-1]处
exchange=1;
//做“发生了交换”标志
}
if(exchange==0)break;
////当exchange为0则停止排序
for(j=i;
j<
=CurrentSize-i-1;
j++) //正向起泡
if(Vector[j]>
Vector[j+1]){ //发生逆序
Swap(Vector[j],Vector[j+1]);
//交换,最大关键码放在Vector[n-i]处
if(exchange==0)break;
i++;
}
}
9-5如果待排序的关键码序列已经按非递减次序有序排列,试证明函数QuickSort()的计算时间将下降到O(n2)。
9-6在实现快速排序的非递归算法时,可根据基准对象,将待排序关键码序列划分为两个子序列。
若下一趟首先对较短的子序列进行排序,试证明在此做法下,快速排序所需要的栈的深度为O(log2n)。
9-7在实现快速排序算法时,可先检查位于两端及中点的关键码,取三者之中的数值不是最大也不是最小的关键码作为基准对象。
试编写基于这种思想的快速排序算法,并证明对于已排序的关键码序列,该算法的计算时间为O(nlog2n)。
9-8在使用非递归方法实现快速排序时,通常要利用一个栈记忆待排序区间的两个端点。
那么能否用队列来代替这个栈?
为什么?
可以用队列来代替栈。
在快速排序的过程中,通过一趟划分,可以把一个待排序区间分为两个子区间,然后分别对这两个子区间施行同样的划分。
栈的作用是在处理一个子区间时,保存另一个子区间的上界和下界,待该区间处理完成后再从栈中取出另一子区间的边界,对其进行处理。
这个功能利用队列也可以实现,只不过是处理子区间的顺序有所变动而已。
9-9试设计一个算法,使得在O(n)的时间内重排数组,将所有取负值的关键码排在所有取正值(非负值)的关键码之前。
9-10奇偶交换排序是另一种交换排序。
它的第一趟对序列中的所有奇数项i扫描,第二趟对序列中的所有偶数项i扫描。
若A[i]>
A[i+1],则交换它们。
第三趟有对所有的奇数项,第四趟对所有的偶数项,…,如此反复,直到整个序列全部排好序为止。
(1)这种排序方法结束的条件是什么?
(2)写出奇偶交换排序的算法。
(3)当待排序关键码序列的初始排列是从小到大有序,或从大到小有序时,在奇偶交换排序过程中的关键码比较次数是多少?
9-11请编写一个算法,在基于单链表表示的待排序关键码序列上进行简单选择排序。
9-12若参加锦标赛排序的关键码有11个,为了完成排序,至少需要多少次关键码比较?
9-13试给出适用于锦标赛排序的胜者树的类型声明。
并写一个函数,对n个参加排序的对象,构造胜者树。
设n是2的幂。
9-14手工跟踪对以下各序列进行堆排序的过程。
给出形成初始堆及每选出一个关键码后堆的变化。
(1)按字母顺序排序:
Tim,Dot,Eva,Rom,Kim,guy,Ann,Jim,Kay,Ron,Jan
(2)按数值递增顺序排序:
26,33,35,29,19,12,22
(3)同样7个数字,换一个初始排列,再按数值的递增 顺序排序:
12,19,33,26,29,35,22
9-15如果只想在一个有n个元素的任意序列中得到其中最小的第k(k<
<
n)个元素之前的部分排序序列,那么最好采用什么排序方法?
例如有这样一个序列:
{503,017,512,908,170,897,275,653,612,154,509,612*,677,765,094},要得到其第4个元素之前的部分有序序列:
{017,094,154,170},用所选择的算法实现时,要执行多少次比较?
一般来讲,当n比较大且要选的数据k<
n时,采用堆排序方法中的筛选(调整)算法最好。
但当n比较小时,采用锦标赛排序方法更好。
例如,对于序列{57,40,38,11,13,34,48,75,6,19,9,7},选最小的数据6,需形成初始堆,进行18次数据比较;
选次小数据7时,需进行4次数据比较;
再选数据9时,需进行6次数据比较;
选数据11时,需进行4次数据比较。
但如果选用锦标赛排序,对于有n个数据的序列,选最小数据需进行n-1次数据比较,以后每选一个数据,进行数据比较的次数,均需ë
log2nû
次。
例如,同样12个数据,第一次选最小的数据6,需进行11次数据比较,以后选7、9、11时,都是ë
log212û
=3次数据比较。
9-16希尔排序、简单选择排序、快速排序和堆排序是不稳定的排序方法,试举例说明。
(1)希尔排序 {512 275 275* 061}增量为2
{275* 061 512 275} 增量为1
{061 275*275 512}
(2)直接选择排序 {275 275*512 061}i=1
{061 275*512 275}i=2
{061 275*512 275}i=3
{061 275*275 512}
(3)快速排序 {512 275 275*}
{275* 275 512}
(4)堆排序 {275275*061170}已经是最大堆,交换275与170
{170275*061275}对前3个调整
{275*170061275}前3个最大堆,交换275*与061
{061170275*275}对前2个调整
{170061275*275}前2个最大堆,交换170与061
{061170275*275}
9-17设有n个待排序元素存放在一个不带表头结点的单链表中,每个链表结点只存放一个元素,头指针为r。
试设计一个算法,对其进行二路归并排序,要求不移动结点中的元素,只改各链结点中的指针,排序后r仍指示结果链表的第一个结点。
(提示:
先对待排序的单链表进行一次扫描,将它划分为若干有序的子链表,其表头指针存放在一个指针队列中。
当队列不空时重复执行,从队列中退出两个有序子链表,对它们进行二路归并,结果链表的表头指针存放到队列中。
如果队列中退出一个有序子链表后变成空队列,则算法结束。
这个有序子链表即为所求。
)
(1)两路归并算法
proceduremerge(ha,hb:
pointer;
varhc:
pointer);
varpa,pb,pc:
begin
ifha↑.data<
=hb↑.data
thenbeginhc:
=ha;
pa:
=ha↑.next;
pb:
=hb;
end
elsebeginhc:
=hb↑.next;
end;
pc:
=hc;
while(pa<
>
nil)and(pb<
nil)do
ifpa↑.data<
=pb↑.data
thenbegin
pc↑.
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 清华大学 课程 讲义 数据结构 答案
![提示](https://static.bdocx.com/images/bang_tan.gif)