1. 程式人生 > >《資料結構 》排序試題附答案

《資料結構 》排序試題附答案

《資料結構 》排序試題附答案

 

一、選擇題

1.某內排序方法的穩定性是指(    )。

A.該排序演算法不允許有相同的關鍵字記錄      B.該排序演算法允許有相同的關鍵字記錄

C.平均時間為0(n log n)的排序方法        D.以上都不對

2.下面給出的四種排序法中(    )排序法是不穩定性排序法。

    A. 插入           B. 冒泡              C. 二路歸併        D. 堆積

3.下列排序演算法中,其中(    )是穩定的。

A. 堆排序,氣泡排序              B. 快速排序,堆排序  

 C. 直接選擇排序,歸併排序       D. 歸併排序,氣泡排序

4.穩定的排序方法是(    )

A.直接插入排序和快速排序       B.折半插入排序和起泡排序

C.簡單選擇排序和四路歸併排序   D.樹形選擇排序和shell排序

5.下列排序方法中,哪一個是穩定的排序方法?(  )

A.直接選擇排序      B.二分法插入排序      C.希爾排序        D.快速排序

6.若要求儘可能快地對序列進行穩定的排序,則應選(A.快速排序 B.歸併排序 C.氣泡排序)。

7.如果待排序序列中兩個資料元素具有相同的值,在排序前後它們的相互位置發生顛倒,則稱該排序演算法是不穩定的。(    )就是不穩定的排序方法。

A.起泡排序    B.歸併排序    C.Shell排序    D.直接插入排序    E.簡單選擇排序

8.若要求排序是穩定的,且關鍵字為實數,則在下列排序方法中應選(    )排序為宜。

A.直接插入 B.直接選擇 C.堆 D.快速 E.基數 

9.若需在O(nlog2n)的時間內完成對陣列的排序,且要求排序是穩定的,則可選擇的排序方法是(    )。

 A. 快速排序        B. 堆排序        C. 歸併排序         D. 直接插入排序

10.下面的排序演算法中,不穩定的是(    )

       A.起泡排序   B.折半插入排序   C.簡單選擇排序    D.希爾排序     E.基數排序   F.堆排序。

11.下列內部排序演算法中:

A.快速排序   B.直接插入排序 C. 二路歸併排序 D. 簡單選擇排序 E. 起泡排序   F. 堆排序

(1) 其比較次數與序列初態無關的演算法是(    )    (2)不穩定的排序演算法是(    )

3)在初始序列已基本有序(除去n個元素中的某k個元素後即呈有序,k<<n)的情況下,排序效率最高的演算法是(    )

(4)排序的平均時間複雜度為O(n•logn)的演算法是(    )為O(n•n)的演算法是(    )

12.排序趟數與序列的原始狀態有關的排序方法是(    )排序法。

   A.插入            B. 選擇              C. 冒泡            D. 快速

13.下面給出的四種排序方法中,排序過程中的比較次數與排序方法無關的是。(    )

A.選擇排序法      B. 插入排序法       C. 快速排序法        D. 堆積排序法

14.對下列四種排序方法,在排序中關鍵字比較次數同記錄初始排列無關的是(    )。

A.直接插入       B. 二分法插入        C. 快速排序         D. 歸併排序   

15.在下列排序演算法中,哪一個演算法的時間複雜度與初始排序無關( )。

A. 直接插入排序   B. 氣泡排序     C. 快速排序     D. 直接選擇排序

16.比較次數與排序的初始狀態無關的排序方法是(     )。

A.直接插入排序       B.起泡排序      C.快速排序       D.簡單選擇排序

17.資料序列(8,9,10,4,5,6,20,1,2)只能是下列排序演算法中的(    )的兩趟排序後的結果。

A.選擇排序        B.氣泡排序         C.插入排序         D.堆排序

18.資料序列(2,1,4,9,8,10,6,20)只能是下列排序演算法中的(    )的兩趟排序後的結果。

A. 快速排序         B. 氣泡排序          C. 選擇排序         D. 插入排序

19.對一組資料(84,47,25,15,21)排序,資料的排列次序在排序的過程中的變化為

(1) 84 47 25 15 21 (2) 15 47 25 84 21 (3) 15 21 25 84 47 (4) 15 21 25 47 84

則採用的排序是 (     )。

A. 選擇            B. 冒泡           C. 快速            D. 插入

20.對序列{15,9,7,8,20,-1,4}進行排序,進行一趟後資料的排列變為{4,9,-1,8,20,7,15};則採用的是(    )排序。

A. 選擇           B. 快速           C. 希爾            D. 冒泡

21.若上題的資料經一趟排序後的排列為{9,15,7,8,20,-1,4},則採用的是(    )排序。

A.選擇      B. 堆      C. 直接插入    D. 冒泡

22.下列排序演算法中(    )不能保證每趟排序至少能將一個元素放到其最終的位置上。

A.快速排序 B. shell排序 C. 堆排序   D.氣泡排序 

23.下列排序演算法中(    )排序在一趟結束後不一定能選出一個元素放在其最終位置上。

A. 選擇           B. 冒泡           C. 歸併        D. 堆

24.下列序列中,(    )是執行第一趟快速排序後所得的序列。

    A. [68,11,18,69]   [23,93,73]       B. [68,11,69,23]   [18,93,73]

    C. [93,73]   [68,11,69,23,18]       D. [68,11,69,23,18]   [93,73]

25.有一組資料(15,9,7,8,20,-1,7,4) 用快速排序的劃分方法進行一趟劃分後資料的排序為 (    )(按遞增序)。

A.下面的B,C,D都不對。        B.9,7,8,4,-1,7,15,20

C.20,15,8,9,7,-1,4,7     D. 9,4,7,8,7,-1,15,20

26.一組記錄的關鍵碼為(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,84,56,79)

27. 在下面的排序方法中,輔助空間為O(n)的是(    ) 。

      A.希爾排序       B. 堆排序         C. 選擇排序        D. 歸併排序    

28.下列排序演算法中,在待排序資料已有序時,花費時間反而最多的是(     )排序。

     A. 冒泡 B. 希爾 C. 快速 D. 堆

29.下列排序演算法中,在每一趟都能選出一個元素放到其最終位置上,並且其時間效能受資料初始特性影響的是:(    )。

A. 直接插入排序     B. 快速排序     C. 直接選擇排序      D. 堆排序

30. 對初始狀態為遞增序列的表按遞增順序排序,最省時間的是(    )演算法,最費時間的是(    )演算法。

    A. 堆排序    B. 快速排序    C. 插入排序     D. 歸併排序 

31. 就平均效能而言,目前最好的內排序方法是(    )排序法。

A. 冒泡   B. 希爾插入   C. 交換 D. 快速

32.如果只想得到1000個元素組成的序列中第5個最小元素之前的部分排序的序列,用(    )方法最快。

A.起泡排序   B.快速排列 C.Shell排序 D.堆排序 E.簡單選擇排序

答案: 

 

1.D 2.D 3.D 4.B 5.B   6.B 7.C,E 8.A 9.C 10.C,D,F 11.1D,C 11.2A,D,F
11.3B 11.4(A,C,F)(B,D,E) 12.C,D 13.A 14.B,D 15.D 16.D 17.C 18.A 19.A 20.C 21.C
22.B 23.C 24.C 25.A 26.C 27.D 28.C 29.B 30.C,B 31.D 32.D      

 

部分答案解釋如下:

18. 對於後三種排序方法兩趟排序後,序列的首部或尾部的兩個元素應是有序的兩個極值,而給定的序列並不滿足。

20. 本題為步長為3的一趟希爾排序。             24.樞軸是73。 

49. 小根堆中,關鍵字最大的記錄只能在葉結點上,故不可能在小於等於n/2的結點上。

64. 因組與組之間已有序,故將n/k個組分別排序即可,基於比較的排序方法每組的時間下界為O(klog2k),全部時間下界為O(nlog2k)。

 

 

二、判斷題:

1.當待排序的元素很大時,為了交換元素的位置,移動元素要佔用較多的時間,這是影響時間複雜度的主要因素。(    )

2.內排序要求資料一定要以順序方式儲存。 (    )

3.排序演算法中的比較次數與初始元素序列的排列無關。()

4.排序的穩定性是指排序演算法中的比較次數保持不變,且演算法能夠終止。(    )

5.在執行某個排序演算法過程中,出現了排序碼朝著最終排序序列位置相反方向移動,則該演算法是不穩定的。( )

6.直接選擇排序演算法在最好情況下的時間複雜度為O(N)。( )

7.兩分法插入排序所需比較次數與待排序記錄的初始排列狀態相關。()

8.在初始資料表已經有序時,快速排序演算法的時間複雜度為O(nlog2n )。(    )

9.在待排資料基本有序的情況下,快速排序效果最好。(    )

10.當待排序記錄已經從小到大排序或者已經從大到小排序時,快速排序的執行時間最省。(    )

11.快速排序的速度在所有排序方法中為最快,而且所需附加空間也最少。(    )

12.堆肯定是一棵平衡二叉樹。(    )

13.堆是滿二叉樹。(    )【

14.(101,88,46,70,34,39,45,58,66,10)是堆。( )

15.在用堆排序演算法排序時,如果要進行增序排序,則需要採用“大根堆”。(    )

16.堆排序是穩定的排序方法。(    )

17.歸併排序輔助儲存為O(1)。(    )

18.在分配排序時,最高位優先分配法比最低位優先分配法簡單。( )

19. 氣泡排序和快速排序都是基於交換兩個逆序元素的排序方法,氣泡排序演算法的最壞時間複雜性是O(n*n),而快速排序演算法的最壞時間複雜性是O(nlog2n),所以快速排序比氣泡排序演算法效率更高。 (    )

20.交換排序法是對序列中的元素進行一系列比較,當被比較的兩個元素逆序時,進行交換,氣泡排序和快速排序是基於這類方法的兩種排序方法,氣泡排序演算法的最壞時間複雜性是O(n*n) ,(    )而快速排序演算法的最壞時間複雜性是O(nlog2n);所以快速排序比氣泡排序效率更高。

21.快速排序和歸併排序在最壞情況下的比較次數都是O(nlog2n)。(   )

22.在任何情況下,歸併排序都比簡單插入排序快。(   )

23.歸併排序在任何情況下都比所有簡單排序速度快。(   )

24.快速排序總比簡單排序快。(   )

25. 中序周遊(遍歷)平衡的二叉排序樹,可得到最好排序的關鍵碼序列。(    )

三、填空題

1.若不考慮基數排序,則在排序過程中,主要進行的兩種基本操作是關鍵字的______和記錄的_____。

2. 外排序的基本操作過程是_______和_______。

3. 屬於不穩定排序的有__________。

4.分別採用堆排序,快速排序,氣泡排序和歸併排序,對初態為有序的表,則最省時間的是_____演算法,最費時間的是______演算法。

5. 不受待排序初始序列的影響,時間複雜度為O(N2)的排序演算法是_____,在排序演算法的最後一趟開始之前,所有元素都可能不在其最終位置上的排序演算法是_____。

6.直接插入排序用監視哨的作用是_______。

7.對n個記錄的表r[1..n]進行簡單選擇排序,所需進行的關鍵字間的比較次數為_______。

8. 用連結串列表示的資料的簡單選擇排序,結點的域為資料域data ,指標域 next ;連結串列首指標為head ,連結串列無頭結點。

selectsort(head)

    p=head;

while (p(1)_______)

{q=p; r=(2)_______

       while((3)______ )

{if ((4)_______ ) q=r;

          r=(5)_______ ;

}

      tmp=q->data; q->data=p->data; p->data=tmp; p= (6)_______ ;

      } 

9.下面的c函式實現對連結串列head進行選擇排序的演算法,排序完畢,連結串列中的結點按結點值從小到大連結。請在空框處填上適當內容,每個空框只填一個語句或一個表示式:

#include <stdio.h>

typedef struct node {char data; struct node *link; }node;

node *select(node *head)

{node *p,*q,*r,*s;

p=(node *)malloc(sizeof(node));

   p->link=head; head=p;

while(p->link!=null)

     {q=p->link; r=p;

      while ((1)____)

         { if (q->link->data<r->link->data) r=q;

           q=q->link;

 }

      if ((2)____) {s=r->link; r->link=s->link; s->link= ((3)_____); ((4)_____);}

      ((5)____) ;

     }

p=head; head=head->link; free(p); return(head);

}

10.下面的排序演算法的思想是:第一趟比較將最小的元素放在r[1]中,最大的元素放在r[n]中,第二趟比較將次小的放在r[2]中,將次大的放在r[n-1]中,…,依次下去,直到待排序列為遞增序。(注:<-->)代表兩個變數的資料交換)。

void sort(SqList &r,int n) {

         i=1;

while((1)__)   {

min=max=1;

for (j=i+1;(2)____ ;++j) 

{if((3)____) min=j; else if(r[j].key>r[max].key) max=j; }

if((4)_____) r[min] < ---- >r[j];

if(max!=n-i+1){if ((5)___) r[min] < ---- > r[n-i+1]; else ((6)__); }

i++;

}

}//sort

 

 

 

 

習題答案:

 

二、判斷題

 

1.√ 2.× 3.× 4.× 5.× 6.× 7.× 8.× 9.× 10.× 11.× 12.× 13.×
14.√ 15.√ 16.× 17.× 18.× 19.× 20.× 21.× 22.× 23.× 24.× 25.√  

 

部分答案解釋如下:

5. 錯誤。例如氣泡排序是穩定排序,將4,3,2,1按氣泡排序排成升序序列,第一趟變成3,2,1,4,此時3就朝向最終位置的相反方向移動。      12. 錯誤。堆是n個元素的序列,可以看作是完全二叉樹,但相對於根並無左小右大的要求,故其既不是二叉排序樹,更不會是平衡二叉樹。

22. 錯誤。待排序序列為正序時,簡單插入排序比歸併排序快。

 

三、填空題

1. 比較,移動    2.生成有序歸併段(順串),歸併    3.希爾排序、簡單選擇排序、快速排序、堆排序等

4. 冒泡,快速    5. (1)簡單選擇排序     (2)直接插入排序(最小的元素在最後時)

6. 免去查詢過程中每一步都要檢測整個表是否查詢完畢,提高了查詢效率。        7. n(n-1)/2

8.題中p指向無序區第一個記錄,q指向最小值結點,一趟排序結束,p和q所指結點值交換,同時向後移p指標。(1)!=null        (2)p->next (3)r!=null (4)r->data<q->data (5)r->next (6)p->next

9. 題中為操作方便,先增加頭結點(最後刪除),p指向無序區的前一記錄,r指向最小值結點的前驅,一趟排序結束,無序區第一個記錄與r所指結點的後繼交換指標。

(1)q->link!=NULL (2)r!=p    (3)p->link (4)p->link=s       (5)p=p->link

10.(1)i<n-i+1 (2)j<=n-i+1 (3)r[j].key<r[min].key (4)min!=i (5)max==i (6)r[max]<-->r[n-i+1]