数据结构第8章内部排序.docx

上传人:b****5 文档编号:6445776 上传时间:2023-01-06 格式:DOCX 页数:13 大小:147KB
下载 相关 举报
数据结构第8章内部排序.docx_第1页
第1页 / 共13页
数据结构第8章内部排序.docx_第2页
第2页 / 共13页
数据结构第8章内部排序.docx_第3页
第3页 / 共13页
数据结构第8章内部排序.docx_第4页
第4页 / 共13页
数据结构第8章内部排序.docx_第5页
第5页 / 共13页
点击查看更多>>
下载资源
资源描述

数据结构第8章内部排序.docx

《数据结构第8章内部排序.docx》由会员分享,可在线阅读,更多相关《数据结构第8章内部排序.docx(13页珍藏版)》请在冰豆网上搜索。

数据结构第8章内部排序.docx

数据结构第8章内部排序

第8章内部排序

【例8-1】已知关键字序列(12,77,21,65,38,7,38,53),给出采用直接插入排序方法按关键字递增序排列时的每一趟结果。

解:

初始127721653873853

1趟127721653873853

2趟122177653873853

3趟122165773873853

4趟122138657773853

5趟712213865773853

6趟712213838657753

7趟712213838536577

(表示有序区)

【例8-2】待排序列为(39,80,76,41,13,29,50,78,30,11,100,7,41,86),步长因子分别取5、3、1,给出采用希尔排序方法按关键字递增序排列时的每一趟结果。

解:

排序过程如下:

p=5  3980764113295078301110074186

子序列分别为{39,29,100},{80,50,7},{76,78,41},{41,30,86},{13,11}。

第一趟排序结果:

p=32974130113950764113100807886

子序列分别为{29,30,50,13,78},{7,11,76,100,86},{41,39,41,80}。

第二趟排序结果:

p=11373929114130764150868078100

此时,序列基本“有序”,对其进行直接插入排序,得到最终结果:

7111329303941415076788086100

【例8-3】已知序列(17,18,60,40,7,32,73,65,85),请给出采用冒泡排序法对该序列作升序排序时的每一趟的结果。

解:

初始1趟2趟3趟4趟5趟

1717171777

18181871717

60407181818

40732323232

73240404040

326060606060

736565656565

657373737373

858585858585

(表示有序区)

【例8-4】已知关键字序列(38,12,21,77,65,7,38,53)给出采用快速排序方法按关键字增序排序时的第一趟块排过程,并举出一个反例说明快速排序是不稳定排序。

解:

(1)

初始381221776573853

↑↑

lowhigh

第一次交换

从high开始比较,得到的结果:

712217765□3853

↑↑

lowhigh

从low开始比较,得到的结果:

71221□65773853

↑↑

lowhigh

第二次交换

从high开始比较,得到的结果:

71221□65773853

↑↑

lowhigh

low=high,所以第一趟快速排序的结果为:

712213865773853

关键字序列(2,2,1)可以作为一个反例。

取第一个关键字作为支点,在一趟快排之后的结果是(1,2,2),由于2已在排序后的最终位置,2在2划分出的前一部分子表中,所以2不可能再出现在2之后,即不可能与原始序列中两者的顺序一致。

此反例说明快速排序不是稳定排序。

【例8-5】已知序列(503,87,512,61,908,170,897,275,653,462),给出采用堆排序方法按关键字递增排序时的每一趟结果。

解:

各趟结果如图8-1所示

 

 

 

 

 

 

 

 

 

习题8

一、单项选择题

1.若对n个元素进行直接插入排序,在进行第i趟排序时,假定元素r[i+1]的插入位置为r[j],则需要移动元素的次数为(1.D)。

A.j-iB.i-j-1C.i-jD.i-j+1

2.若对n个元素进行直接插入排序,则进行任一趟排序的过程中,为寻找插入位置而需要的时间复杂度为(2.B)。

A.O

(1)B.O(n)C.O(n2)D.O(log2n)

3.在对n个元素进行直接插入排序的过程中,共需要进行(3.C)趟。

A.nB.n+1C.n-1D.2n

4.对n个元素进行直接插入排序时间复杂度为(4.C)。

A.O

(1)B.O(n)C.O(n2)D.O(log2n)

5.在对n个元素进行冒泡排序的过程中,第一趟排序至多需要进行(5.B)对相邻元素之间的交换。

A.nB.n-1C.n+1D.n/2

6.在对n个元素进行冒泡排序的过程中,最好情况下的时间复杂度为(6.D)。

A.O

(1)B.O(log2n)C.O(n2)D.O(n)

7.在对n个元素进行冒泡排序的过程中,至少需要(7.A)趟完成。

A.1B.nC.n-1D.n/2

8.在对n个元素进行快速排序的过程中,若每次划分得到的左、右两个子区间中元素的个数相等或只差一个,则整个排序过程得到的含两个或两个元素的区间个数大致为(8.B)。

A.nB.n/2C.log2nD.2n

9.在对n个元素进行快速排序的过程中,第一次划分最多需要移动(9.D)次元素,包括开始把支点元素移动到临时变量的一次在内。

A.n/2B.n-1C.nD.n+1

10.在对n个元素进行快速排序的过程中,最好情况下需要进行(10.C)躺。

A.nB.n/2C.log2nD.2n

11.在对n个元素进行快速排序的过程中,最坏情况下需要进行(11.B)躺。

A.nB.n-1C.n/2D.log2n

12.在对n个元素进行快速排序的过程中,平均情况下的时间复杂度为(12.D)。

A.O

(1)B.O(log2n)C.O(n2)D.O(nlog2n)

13.在对n个元素进行快速排序的过程中,最坏情况下的时间复杂度为(13.C)。

A.O

(1)B.O(log2n)C.O(n2)D.O(nlog2n)

14.在对n个元素进行快速排序的过程中,平均情况下的空间复杂度为(14.D)。

A.O

(1)B.O(log2n)C.O(n2)D.O(nlog2n)

15.在对n个元素进行直接插入排序的过程中,算法的空间复杂度为(15.A)。

A.O

(1)B.O(log2n)C.O(n2)D.O(nlog2n)

16.对下列四个序列进行快速排序,各以第一个元素为基准进行第一次划分,则在该次划分过程中需要移动元素次数最多的序列为(16.D)。

A.1,3,5,7,9B.9,7,5,3,1

C.5,3,1,7,9D.5,7,9,1,3

17.假定对元素序列(7,3,5,9,1,12,8,15)进行快速排序,则进行第一次划分后,得到的左区间中元素的个数为(17.B)。

A.2B.3C.4D.5

18.在对n个元素进行简单选择排序的过程中,需要进行(18.C)趟选择和交换。

A.nB.n+1C.n-1D.n/2

19.在对n个元素进行堆排序的过程中,时间复杂度为(19.D)。

A.O

(1)B.O(log2n)C.O(n2)D.O(nlog2n)

20.在对n个元素进行堆排序的过程中,空间复杂度为(20.A)。

A.O

(1)B.O(log2n)C.O(n2)D.O(nlog2n)

21.假定对元素序列(7,3,5,9,1,12)进行堆排序,并且采用小根堆,则由初始数据构成的初始堆为(21.B)。

A.1,3,5,7,9,12B.1,3,5,9,7,12

C.1,5,3,7,9,12D.1,5,3,9,12,7

22.假定一个初始堆为(1,5,3,9,12,7,15,10),则进行第一趟堆排序后得到的结果为(22.A)。

A.3,5,7,9,12,10,15,1B.3,5,9,7,12,10,15,1

C.3,7,5,9,12,10,15,1D.3,5,7,12,9,10,15,1

23.若对n个元素进行归并排序,则进行归并的趟数为(23.D)。

A.nB.n-1C.n/2D.log2n

24.若一个元素序列基本有序,则选用(24.A)方法较快。

A.直接插入排序B.简单选择排序

C.堆排序D.快速排序

25.若要从1000个元素中得到10个最小值元素,最好采用(25.B)方法。

A.直接插入排序B.简单选择排序

C.堆排序D.快速排序

26.若要对1000个元素排序,要求既快又稳定,则最好采用(26.B)方法。

A.直接插入排序B.归并排序C.堆排序D.快速排序

27.若要对1000个元素排序,要求既快又节省存储空间,则最好采用(27.C)方法。

A.直接插入排序B.归并排序C.堆排序D.快速排序

28.在平均情况下速度最快的排序方法为(28.D)。

A.简单选择排序B.归并排序C.堆排序D.快速排序

二、填空题

1.每次从无序子表中取出一个元素,把它插入到有序子表中的适当位置,此种排序方法叫做________排序;每次从无序子表中挑选出一个最小或最大元素,把它交换到有序表的一端,此种排序方法叫做________排序。

1.插入,选择

2.每次直接或通过支点元素间接比较两个元素,若出现逆序排列时就交换它们的位置,此种排序方法叫做________排序;每次使两个相邻的有序表合并成一个有序表的排序方法叫做________排序。

2.快速,归并

3.在简单选择排序中,记录比较次数的时间复杂度为________,记录移动次数的时间复杂度为________。

3.O(n2),O(n)

4.对n个记录进行冒泡排序时,最少的比较次数为________,最少的趟数为_______。

4.n-1,1

5.快速排序在平均情况下的时间复杂度为________,在最坏情况下的时间复杂度为________。

5.O(nlog2n),O(n2)

 

6.若对一组记录(46,79,56,38,40,80,35,50,74)进行直接插入排序,当把第8个记录插入到前面已排序的有序表时,为寻找插入位置需比较________次。

6.4

7.假定一组记录为(46,79,56,38,40,84),则利用堆排序方法建立的初始小根堆为____________________。

7.(38,40,56,79,46,84)

8.假定一组记录为(46,79,56,38,40,84),在冒泡排序的过程中进行第一趟排序后的结果为____________________。

8.(46,56,38,40,79,84)

9.假定一组记录为(46,79,56,64,38,40,84,43),在冒泡排序的过程中进行第一趟排序时,元素79将最终下沉到其后第_______个元素的位置。

9.4

10.假定一组记录为(46,79,56,38,40,80),对其进行快速排序的过程中,共需要________趟排序。

10.3

11.假定一组记录为(46,79,56,38,40,80),对其进行快速排序的过程中,含有两个或两个以上元素的排序区间的个数为________个。

11.4

12.假定一组记录为(46,79,56,25,76,38,40,80),对其进行快速排序的第一次划分后,右区间内元素的个数为__________。

12.4

13.假定一组记录为(46,79,56,38,40,80),对其进行快速排序的第一次划分后的结果为____________________。

13.[4038]46[567980]

 

14.假定一组记录为(46,79,56,38,40,80,46,75,28,46),对其进行归并排序的过程中,第二趟归并后的子表个数为________________。

14.3

15.假定一组记录为(46,79,56,38,40,80,46,75,28,46),对其进行归并排序的过程中,第三趟归并后的第2个子表为________________。

15.[2846]

16.假定一组记录为(46,79,56,38,40,80,46,75,28,46),对其进行归并排序的过程中,供需要__________趟完成。

16.4

 

17.在时间复杂度为O(nlog2n)的所有排序方法中,________排序方法是稳定的。

17.归并

18.在时间复杂度为O(n2)的所有排序方法中,________排序方法是不稳定的。

18.直接选择

19.在所有排序方法中,________排序方法采用的是二分法的思想。

19.快速

20.在所有排序方法中,________方法使数据的组织采用的是完全二叉树的结构。

20.堆排序

21.在所有排序方法中,________方法采用的是两两有序表合并的思想。

21.归并排序

22.________排序方法使键值大的记录逐渐下沉,使键值小的记录逐渐上浮。

22.冒泡

23.________排序方法能够每次使无序表中的第一个记录插入到有序表中。

23.直接插入

24.________排序方法能够每次从无序表中顺序查找出一个最小值。

24.直接选择

三、应用题

1.已知一组记录为(46,74,53,14,26,38,86,65,27,34),给出采用直接插入排序法进行排序时每一趟的排序结果。

1.

(0)[46]745314263886652734

(1)[4674]5314263886652734

(2)[465374]14263886652734

(3)[14465374]263886652734

(4)[1426465374]3886652734

(5)[142638465374]86652734

(6)[14263846537486]652734

(7)[1426384653657486]2734

(8)[142627384653657486]34

(9)[14262734384653657486]

2.已知一组记录为(46,74,53,14,26,38,86,65,27,34),给出采用冒泡排序法进行排序时每一趟的排序结果。

2.

(0)[46745314263886652734]

(1)[465314263874652734]86

(2)[4614263853652734]7486

(3)[14263846532734]657486

(4)[142638462734]53657486

(5)[1426382734]4653657486

(6)[14262734]384653657486

(7)[14262734]384653657486

3.已知一组记录为(46,74,53,14,26,38,86,65,27,34),给出采用快速排序法进行排序时每一趟的排序结果。

3.

(0)[46745314263886652734]

(1)[3427381426]46[86655374]

(2)[262714]343846[746553]86

(3)142627343846[5365]7486

(4)14262734384653657486

4.已知一组记录为(46,74,53,14,26,38,86,65,27,34),给出采用简单选择排序法进行排序时每一趟的排序结果。

4.

(0)[46745314263886652734]

(1)14[745346263886652734]

(2)1426[5346743886652734]

(3)142627[46743886655334]

(4)14262734[743886655346]

(5)1426273438[7486655346]

(6)142627343846[86655374]

(7)14262734384653[658674]

(8)1426273438465365[8674]

(9)142627343846536574[86]

5.已知一组记录为(46,74,53,14,26,38,86,65,27,34),给出采用堆排序法进行排序时每一趟的排序结果。

5. 构成初始堆(即建堆)的过程:

12345678910

(0)46745314263886652734

(1)46745314263886652734

(2)46745314263886652734

(3)46743814265386652734

(4)46143827265386657434

(5)14263827345386657446

进行堆排序的过程:

(0)14263827345386657446

(1)262738463453866574[14]

(2)2734384674538665[2614]

(3)34463865745386[272614]

(4)384653657486[34272614]

(5)4665538674[3834272614]

(6)53657486[463834272614]

(7)658674[53463834272614]

(8)7486[6553463834272614]

(9)86[746553463834272614]

6.已知一组记录为(46,74,53,14,26,38,86,65,27,34),给出采用归并排序法进行排序时每一趟的排序结果。

6.

(0)[46][74][53][14][26][38][86][65][27][34]

(1)[4674][1453][2638][6586][2734]

(2)[14465374][26386586][2734]

(3)[1426384653657486][2734]

(3)[14262734384653657486]

四、算法设计题

1.编写一个双向起泡的排序算法,即相邻两趟向相反方向起泡。

1.

voidBubble_Sort2(inta[],intn)//相邻两趟是反方向起泡的冒泡排序算法

{low=0;high=n-1;//冒泡的上下界

  change=1;

  while(low

  {   change=0;

    for(i=low;i

      if(a[i]>a[i+1])

      {a[i]<->a[i+1];

        change=1;

      }

    high--;//修改上界

    for(i=high;i>low;i--)//从下向上起泡

      if(a[i]

      { a[i]<->a[i-1];

       change=1;

      }

    low++;//修改下界

  }//while

}//Bubble_Sort2

2.试以单链表为存储结构实现简单选择排序的算法。

2.

voidLinkList_Select_Sort(LinkList&L)//单链表上的简单选择排序算法

{for(p=L;p->next->next;p=p->next)

  { q=p->next;x=q->data;

   for(r=q,s=q;r->next;r=r->next)//在q后面寻找元素值最小的结点

     if(r->next->data

     { x=r->next->data;

        s=r;

    }

    if(s!

=q)//找到了值比q->data更小的最小结点s->next

    {p->next=s->next;s->next=q;

      t=q->next;q->next=p->next->next;

      p->next->next=t;

    }//交换q和s->next两个结点

  }//for

}//LinkList_Select_Sort

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

当前位置:首页 > 工程科技 > 能源化工

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

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