清华大学课程讲义-数据结构答案9[1]文档格式.doc

上传人:b****3 文档编号:14911625 上传时间:2022-10-25 格式:DOC 页数:7 大小:214KB
下载 相关 举报
清华大学课程讲义-数据结构答案9[1]文档格式.doc_第1页
第1页 / 共7页
清华大学课程讲义-数据结构答案9[1]文档格式.doc_第2页
第2页 / 共7页
清华大学课程讲义-数据结构答案9[1]文档格式.doc_第3页
第3页 / 共7页
清华大学课程讲义-数据结构答案9[1]文档格式.doc_第4页
第4页 / 共7页
清华大学课程讲义-数据结构答案9[1]文档格式.doc_第5页
第5页 / 共7页
点击查看更多>>
下载资源
资源描述

清华大学课程讲义-数据结构答案9[1]文档格式.doc

《清华大学课程讲义-数据结构答案9[1]文档格式.doc》由会员分享,可在线阅读,更多相关《清华大学课程讲义-数据结构答案9[1]文档格式.doc(7页珍藏版)》请在冰豆网上搜索。

清华大学课程讲义-数据结构答案9[1]文档格式.doc

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↑.

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工程科技 > 电子电路

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1