数据结构 排序习题

10数据结构复习题(排序)

 

一.判断题(下列各题,正确的请在前面的括号内打√;错误的打╳ 

 )(1)如果某种排序算法不稳定,则该排序方法就没有实用价值。

 )(2)希尔排序是不稳定的排序。

 )(3)冒泡排序是不稳定的排序。

 )(4)对n个记录的进行快速排序,所需要的平均时间是O(nlog2n)。

)(5)堆排序所需的时间与待排序的记录个数无关。

)(6)当待排序的元素个数很多时,为了交换元素的位置要占用较多的时间,这是影响时间复杂度的主要因素。

 )(7)快速排序在任何情况下都比其它排序方法速度快。

 )(8)对快速排序来说,初始序列为正序或反序都是最坏情况。

 )(9)采用归并排序可以实现外排序。

 )(10)采用希尔方法排序时,若关键字的排列杂乱无序,则效率最高。

 

)(11快速排序算法在每一趟排序中都能找到一个元素放在其最终位置上。

)(12)冒泡排序的时间复杂度是On2)。

 

二.填空题

(1) 大多数排序算法都有两个基本的操作:       和移动

(2) 评价排序算法优劣的主要标准是         和算法所需的附加空间。

(3) 根据被处理的数据在计算机中使用不同的存储设备,排序可分为:       和外排序。

(4) 外排序是指在排序过程中,数据的主要部分存放在计算机的        中。

(5) n个关键字进行冒泡排序,其可能的最小比较次数为:       次。

(6) 在最坏情况下,在第i趟直接插入排序中,要进行     次关键字的比较。

(7) n个关键字进行冒泡排序,时间复杂度为        

(8) 快速排序在最坏情况下的时间复杂度是        

(9) 对于n个记录的集合进行归并排序,所需要的平均时间为:        

(10) 对于n个记录的集合进行归并排序,所需要的附加空间是         

(11) 若原始数据接近无序,则选用         最好。

(12) 在排序前,关键字值相等的不同记录,排序后相对位置保持        的排序方法,称为稳定排序方法。

(13) 在插入排序和选择排序中,若初始数据基本正序,则选用           较好。

(14) 当增量为1时,该趟希尔排序与        排序基本一致。

(15) 第一趟排序后,序列中键值最大的记录交换到最后的排序算法是         

(16) 依次将每个记录插入到一个有序的子文件中的排序方法称为          排序。

(17) 在插入排序、选择排序归并排序中,排序是不稳定的          

(18) 在对一组记录54,38,96,23,15,72,60,45,83进行直接插入排序时,当把第7个记录60插入到有序表时,为寻找插入位置需比较      次。

(19) 两个序列分别为:

   L1={25,57,48,37,92,86,12,33}

   L2={25,37,33,12,48,57,86,92}。

   用冒泡排序法对L1和L2进行排序,交换次数较少的是序列:      

20)对一组记录(543596211272604480)进行直接选择排序时,第四次选择和交换后,未排序记录是         

 

三.选择题

1排序是根据(     )的大小重新安排各元素的顺序。

    A.关键字          B.数组            C.元素件          D.结点

2)评价排序算法好坏的标准主要是(    )。

A.执行时间                           B.辅助空间

C.算法本身的复杂度                   D.执行时间和所需的辅助空间

3)直接插入排序的方法是(    )的排序方法。

    A.不稳定          B.稳定            C.外部            D.选择

4)直接插入排序的方法要求被排序的数据(      )存储。

    A.必须链表        B.必须顺序        C.顺序或链表      D.可以任意

5)排序方法中,从序序列中选择关键字最小的记录,将其与无序区(初始为空)的第一个记录交换的排序方法,称为 (   )。

    A.希尔排序        B.归并排序        C.插入排序        D. 选择排序

6)每次把待排序方的区间划分为左、右两个区间,其中左区间中元素的值不大于基准元素的值,右区间中元素的值不小于基准元素的值,此种排序方法叫做(   )。

A.冒泡排序        B.堆排序          C.快速排序        D. 归并排序

7)快速排序在(   )情况下最易发挥其长处。

A.排序的数据中含有多个相同的关键字 B.排序的数据已基本有序

C.排序的数据完全无序               D.排序的数据中最大值与最小值相差悬殊

8)下述几种排序方法中,要求内存量最大的是:(     )。

    A.插入排序        B.选择排序        C.快速排序        D. 归并排序

9)直接插入排序的方法是从第(   )个元素开始,插入到前边适当位置的排序方法。

    A.1               B.2               C.3               D.n

10堆的形状是一棵(     )。

A.二叉排序树      B.满二叉树        C.完全二叉树      D.平衡二叉树

11)内排序是指在排序的整个过程中,全部数据都在计算机的(  )中完成的排序。

    A.内存            B.外存            C.内存和外存      D.寄存器

12)快速排序的方法是(    )的排序方法。

    A.不稳定          B.稳定            C.外部            D.选择

13)下列排序方法中,关键字比较次数与记录的初始排列次序无关的是(    )。

    A.选择排序        B.希尔排序        C.插入排序        D.冒泡排序

14)下述几种排序方法中,平均时间复杂度最小的是(    )。

    A.希尔排序        B.插入排序        C.冒泡排序        D.选择排序

15)对有n个记录的表作快速排序,在最坏情况下,算法的时间复杂度是(   )。

A.O(n)             B.O(n2)            C.O(nlog2n)       D.O(n3)

16)冒泡排序的方法对n个数据进行排序,第一趟排序共需要比较(   )次。

    A.1                B.2                C.n-1             D.n

17)对n个不同的排序码进行冒泡(递增)排序,在下列(    )情况比较的次数最多。

A.从小到大排列好的 B.从大到小排列好的 C. 元素无序       D.元素基本有序

18)用直接插入排序法对下面的四个序列进行由小到大的排序,元素比较次数最少的是(  )。

    A,94,32,40,90,80,46,21,69       B.21,32,46,40,80,69,90,94

    C.32,40,21,46,69,94,90,80       D.90,69,80,46,21,32,94,40

19)一组记录的排序码为(25,48,16,35,79,82,23,40),其中含有4个长度为2的有序表,按归并排序的方法对该序列进行一趟归并后的结果为:( )。

    A,16 25 35 48 23 40 79 82 36 72        B.16 25 35 48 79 82 23 36 40 72

    C.16 25 48 35 79 82 23 36 40 72        D.16 25 35 48 79 23 36 40 72 82

20)一个数据序列的关键字为:(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,79,56,84)

 

四.排序过程分析

1. 已知数据序列{108,18,15716},写出采用直接插入算法排序时,每一趟排序的结果。

 

2. 已知数据序列{18,17,60,400732,73,65},写出采用直接插入算法排序时,每一趟排序的结果。

 

3.  已知数据序列{17186040732736585}

   请写出采用冒泡排序法对该序列作升序排序时每一趟的结果。

 

4. 已知数据序列{80,189,90,27,75,4269,34}

   请写出采用冒泡排序法对该序列作升序排序时每一趟的结果。

5. 已知数据序列{10,18,4,3,6,12,9,15,8},写出希尔排序每一趟(设d=421)排序的结果。

 

6. 已知数据序列{12,02,16,30,28,10,17,20,06,18},写出希尔排序每一趟排序的结果。(设d=5、21

 

7. 已知数据序列{10,18,4,3,6,12,9,15},写出二路归并排序的每一趟排序结果。

      

8. 已知数据序列{53,36,48,3660,7,18,41},写出采用简单选择排序的每一趟排序结果。

 

9. 已知数据序列{101,1518,715},试画出采用快速排序法,第一趟排序的结果。

           

 

10. 已知数据序列{101,1518,715},试写出采用快速排序法,第一趟排序的结果。

 

五.二分插入排序程序填空

void BInsSort( )                    // 按递增序对R[1]~R[ n ]进行二分插入排序

{ int  i, j, low, high, m;

   for ( i=2; i<=       ; i++)

    { R[0]=R[i];               // 设定R[0]为监视哨

low=1; 

high=        

while (low      high)

        {       ;

if ( R[0]

    high=m-1 ;

else

low=m+1;  

}

     for (j=i-1;j>=high+1;j--)

R[j+1]=          ;          // 元素后移

      R[high]=R[0];                 // 插入

}

}

 

六. 算法题

1.以单链表为存储结构,写一个直接选择排序算法。

 

2.以单链表作为存储结构实现直接插入排序算法。

 

3.设计一个算法,使得在尽可能少的时间内重排数组,将所有取负值的关键字放在所有取非负值的关键字之前。

 

4

设已排序的文件用单链表表示,再插入一个新记录,仍然按关键字从小到大的次序排序,试写出该算法。

 

排序过程分析

1. 已知数据序列{5060,40,20,80,15,10,45},试画出采用快速排序法,第一趟排序的结果。

 

2. 已知数据序列{82,40,66,13,84,36,96,57,39,80,61,14},写出二路归并排序的每一趟排序结果。

 

3. 已知数据序列{40,63,11,84,35,93,58,39,15},写出采用简单选择排序的每一趟排序结果。

4. 已知数据序列{18,17,60,400732,73,65},写出采用冒泡排序法每一趟排序的结果。

 

5. 已知数据序列{10,18,14,13,16,12,11,9,15,08},写出希尔排序每一趟排序的结果(设d=5、21)。

 

6. 已知数据序列{39,28,55,80,75,06,17,45},写出采用直接插入算法排序时,每一趟排序的结果。

程序填空

1. 设表的长度为L,试填空完成直接插入排序程序。

void insertsort(int R[ ])           // 按递增序对R[1]~ R[ n ]进行直接插入排序

{ int  i,j;

  for ( i=2; i<=       ; i++ )

    { R[0]=R[i];                // 设定R[0]为监视哨

      j=        

      while (R[0]      R[j] )

        {          ;

          j-- ;  

}

         R[j+1]=        ;        // 插入第i个记录

     }

 }

 

2.直接选择排序

void  selectsort ( )                // 按递增序对R[1] ~ R[n] 进行直接选择排序

{ int i, j, k ;

  for (i=1;i<=        ;i++)

{ k=i ;

    for (j=       ;j<=n;j++)       // 选择选择关键字最小的记录

    if (R[j]       R[k])

       k=j;

    if                                 

{ R[0]=R[ i ];                  // 交换关键字

R[i] =        ;  

R[k]=R[0];

}

}

}

 

3.二分插入排序

void BInsSort( )                    // 按递增序对R[1]~R[ n ]进行二分插入排序

{ int  i, j, low, high, m;

   for ( i=2; i<=      ; i++)

    { R[0]=R[i];               // 设定R[0]为监视哨

low=1; 

high=        

while (low       high)

        {          ;

if ( R[0]

    high=m-1 ;

else

low=m+1;  

}

     for (j=i-1;j>=high+1;j--)

R[j+1]=         ;          // 元素后移

      R[high]=R[0];                 // 插入

}

}

 

算法设计题

1.设计一个函数修改冒泡排序过程以实现双向冒泡排序(每一趟排序,通过相邻的关键字比较,产生最小和最大的两个元素)。

 

2.以单链表为存储结构,写一个直接选择排序算法。

 

3. 设待排序的文件用单链表做存储结构,头指针为head,写出其选择排序算法。

 

你可能感兴趣的:(数据结构)