您好,欢迎访问三七文档
第8章排序1.选择题(1)从未排序序列中依次取出元素与已排序序列中的元素进行比较,将其放入已排序序列的正确位置上的方法,这种排序方法称为()。A.归并排序B.冒泡排序C.插入排序D.选择排序答案:C(2)从未排序序列中挑选元素,并将其依次放入已排序序列(初始时为空)的一端的方法,称为()。A.归并排序B.冒泡排序C.插入排序D.选择排序答案:D(3)对n个不同的关键字由小到大进行冒泡排序,在下列()情况下比较的次数最多。A.从小到大排列好的B.从大到小排列好的C.元素无序D.元素基本有序答案:B解释:对关键字进行冒泡排序,关键字逆序时比较次数最多。(4)对n个不同的排序码进行冒泡排序,在元素无序的情况下比较的次数最多为()。A.n+1B.nC.n-1D.n(n-1)/2答案:D解释:比较次数最多时,第一次比较n-1次,第二次比较n-2次……最后一次比较1次,即(n-1)+(n-2)+…+1=n(n-1)/2。(5)快速排序在下列()情况下最易发挥其长处。A.被排序的数据中含有多个相同排序码B.被排序的数据已基本有序C.被排序的数据完全无序D.被排序的数据中的最大值和最小值相差悬殊答案:C解释:B选项是快速排序的最坏情况。(6)对n个关键字作快速排序,在最坏情况下,算法的时间复杂度是()。A.O(n)B.O(n2)C.O(nlog2n)D.O(n3)答案:B解释:快速排序的平均时间复杂度为O(nlog2n),但在最坏情况下,即关键字基本排好序的情况下,时间复杂度为O(n2)。(7)若一组记录的排序码为(46,79,56,38,40,84),则利用快速排序的方法,以第一个记录为基准得到的一次划分结果为()。A.38,40,46,56,79,84B.40,38,46,79,56,84C.40,38,46,56,79,84D.40,38,46,84,56,79答案:C(8)下列关键字序列中,()是堆。A.16,72,31,23,94,53B.94,23,31,72,16,53C.16,53,23,94,31,72D.16,23,53,31,94,72答案:D解释:D选项为小根堆(9)堆是一种()排序。A.插入B.选择C.交换D.归并答案:B(10)堆的形状是一棵()。A.二叉排序树B.满二叉树C.完全二叉树D.平衡二叉树答案:C(11)若一组记录的排序码为(46,79,56,38,40,84),则利用堆排序的方法建立的初始堆为()。A.79,46,56,38,40,84B.84,79,56,38,40,46C.84,79,56,46,40,38D.84,56,79,40,46,38答案:B(12)下述几种排序方法中,要求内存最大的是()。A.希尔排序B.快速排序C.归并排序D.堆排序答案:C解释:堆排序、希尔排序的空间复杂度为O(1),快速排序的空间复杂度为O(log2n),归并排序的空间复杂度为O(n)。(13)下述几种排序方法中,()是稳定的排序方法。A.希尔排序B.快速排序C.归并排序D.堆排序答案:C解释:不稳定排序有希尔排序、简单选择排序、快速排序、堆排序;稳定排序有直接插入排序、折半插入排序、冒泡排序、归并排序、基数排序。(14)数据表中有10000个元素,如果仅要求求出其中最大的10个元素,则采用()算法最节省时间。A.冒泡排序B.快速排序C.简单选择排序D.堆排序答案:D(15)下列排序算法中,()不能保证每趟排序至少能将一个元素放到其最终的位置上。A.希尔排序B.快速排序C.冒泡排序D.堆排序答案:A解释:快速排序的每趟排序能将作为枢轴的元素放到最终位置;冒泡排序的每趟排序能将最大或最小的元素放到最终位置;堆排序的每趟排序能将最大或最小的元素放到最终位置。2.应用题(1)设待排序的关键字序列为{12,2,16,30,28,10,16*,20,6,18},试分别写出使用以下排序方法,每趟排序结束后关键字序列的状态。①直接插入排序②折半插入排序③希尔排序(增量选取5,3,1)④冒泡排序⑤快速排序⑥简单选择排序⑦堆排序⑧二路归并排序答案:①直接插入排序[212]1630281016*20618[21216]30281016*20618[2121630]281016*20618[212162830]1016*20618[21012162830]16*20618[210121616*2830]20618[210121616*202830]618[2610121616*202830]18[2610121616*18202830]②折半插入排序排序过程同①③希尔排序(增量选取5,3,1)102166181216*203028(增量选取5)621210181616*203028(增量选取3)2610121616*18202830(增量选取1)④冒泡排序21216281016*20618[30]212161016*20618[2830]212101616*618[202830]2101216616*[18202830]21012616[16*18202830]210612[1616*18202830]2610[121616*18202830]2610121616*18202830]⑤快速排序12[6210]12[283016*201618]6[2]6[10]12[283016*201618]28261012[181616*20]28[30]18261012[16*16]18[20]283016*26101216*[16]18202830左子序列递归深度为1,右子序列递归深度为3⑥简单选择排序2[121630281016*20618]26[1630281016*201218]2610[30281616*201218]261012[281616*203018]26101216[2816*203018]2610121616*[28203018]2610121616*18[203028]2610121616*1820[2830]2610121616*182028[30]⑧二路归并排序2121630102816*2061821216301016*2028618210121616*2028306182610121616*18202830(2)给出如下关键字序列{321,156,57,46,28,7,331,33,34,63},试按链式基数排序方法,列出每一趟分配和收集的过程。答案:按最低位优先法→321→156→57→46→28→7→331→33→34→63分配[0][1][2][3][4][5][6][7][8][9]3213334156572833163467收集→321→331→33→63→34→156→46→57→7→28(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,101R2:9,17,19,20,30,50,55,90R3:63.算法设计题(1)试以单链表为存储结构,实现简单选择排序算法。[算法描述]:voidLinkedListSelectSort(LinkedListhead)//本算法一趟找出一个关键字最小的结点,其数据和当前结点进行交换;若要交换指针,则须记下//当前结点和最小结点的前驱指针p=head-next;while(p!=null){q=p-next;r=p;//设r是指向关键字最小的结点的指针while(q!=null){if(q-datar-data)r=q;q:=q-next;}if(r!=p)r-data--p-data;p=p-next;}257140313161119151110111(2)有n个记录存储在带头结点的双向链表中,现用双向冒泡排序法对其按上升序进行排序,请写出这种排序的算法。(注:双向冒泡排序即相邻两趟排序向相反方向冒泡)。[算法描述]:typedefstructnode{ElemTypedata;structnode*prior,*next;}node,*DLinkedList;voidTwoWayBubbleSort(DLinkedListla)//对存储在带头结点的双向链表la中的元素进行双向起泡排序。{intexchange=1;//设标记DLinkedListp,temp,tail;head=la//双向链表头,算法过程中是向下起泡的开始结点tail=null;//双向链表尾,算法过程中是向上起泡的开始结点while(exchange){p=head-next;//p是工作指针,指向当前结点exchange=0;//假定本趟无交换while(p-next!=tail)//向下(右)起泡,一趟有一最大元素沉底if(p-datap-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;}elsep=p-next;//无交换,指针后移tail=p;//准备向上起泡p=tail-prior;while(exchange&&p-prior!=head)//向上(左)起泡,一趟有一最小元素冒出if(p-datap-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;}elsep=p-prior;//无交换,指针前移head=p;//准备向下起泡}//while(exchange)}//算法结束(3)设有顺序放置的n个桶,每个桶中装有一粒砾石,每粒砾石的颜色是红,白,蓝之一。要求重新安排这些砾石,使得所有红色砾石在前,所有白色砾石居中,所有蓝色砾石居后,重新安排时对每粒砾石的颜色只能看一次,并且只允许交换操作来调整砾石的位置。[题目分析]利用快速排序思想解决。由于要求“对每粒砾石的颜色只能看一次”,设3个指针i,j和k,分别指向红色、白色砾石的后一位置和待处理的当前元素。从k=n开始,从右向左搜索,若该元素是兰色,则元素不动,指针左移(即k-1);若当前元素是红色砾石,分i=j(这时尚没有白色砾石)和ij两种情况。前一情况执行第i个元素和第k个元素交换,之后i+1;后一情况,i所指的元素已处理过(白色),j所指的元素尚未处理,应先将i和j所指元素交换,再将i和k所指元素交换。对当前元素是白色砾石的情况,也可类似处理。为方便处理,将三种砾石的颜色用整数1、2和3表示。[算法描述]:voidQkSort(rectyper[],intn){//r为含有n个元素的线性表,元素是具有红、白和兰色的砾石,用顺序存储结构存储,//本算法对其排序,使所有红色砾石在前,白色居中,兰色在最后。inti=1,j=1,k=n,temp;while(k!=j){while(r[k].key==3)k--;//当前元素是兰色砾石,指针左移if(r[k].key==1)//当前元素是红色砾石if(i=j){temp=r[k];r[k]=r[i];r[i]=temp;i++;}//左侧只有红色砾石,交换r[k]和r[i]else{temp=r[j];r[j]=r[i];r[i]=temp;j
本文标题:第8章排序分析
链接地址:https://www.777doc.com/doc-6130371 .html