內部排序-第10章-《數據結構題集》習題解析-嚴蔚敏吳偉民版

習題集解析部分html

第10章 內部排序算法

——《數據結構題集》-嚴蔚敏.吳偉民版數組

       源碼使用說明  連接☛☛☛ 《數據結構-C語言版》(嚴蔚敏,吳偉民版)課本源碼+習題集解析使用說明數據結構

       課本源碼合輯  連接☛☛☛ 《數據結構》課本源碼合輯測試

       習題集全解析  連接☛ 《數據結構題集》習題解析合輯spa

 

      相關測試數據下載  連接☛ 數據包設計

 

      本習題文檔的存放目錄:數據結構\▼配套習題解析\▼10 內部排序3d

      文檔中源碼的存放目錄:數據結構\▼配套習題解析\▼10 內部排序\▼習題測試文檔-10htm

      源碼測試數據存放目錄:數據結構\▼配套習題解析\▼10 內部排序\▼習題測試文檔-10\Datablog

 

1、基礎知識題

10.1❶以關鍵碼序列(503,087,512,061,908,170,897,275,653,426)爲例,手工執行如下排序算法,寫出每一趟排序結束時的關鍵碼狀態:

  (1)直接插入排序;                            (2)希爾排序(增量d[1]=5);

  (3)快速排序;                                  (4)堆排序;

  (5)歸併排序;                                  (6)基數排序。

10.2❶若對下列關鍵字序列按教科書10.3節和10.5節中所列算法進行快速排序和歸併排序,分別寫出三次調用過程Partition和過程Merge後的結果。

(Tim,Kay,Eva,Roy,Dot,Jon,Kim,Ann,Tom,Jim,Guy,Amy)

10.3❷試問在10.1題所列各類排序方法中,哪些是穩定的?哪些是不穩定的?併爲每一種不穩定的排序方法舉出一個不穩定的實例。

10.4❹試問:對初始狀態以下(長度爲n)的各序列進行直接插入排序時,至多需進行多少次關鍵字間的比較(要求排序後的序列按關鍵字自小至大順序有序)?

    (1)關鍵字(自小至大)順序有序;(key1<key2<…<keyn)

    (2)關鍵字(自大至小)逆序有序;(key1>key2>…>keyn)

    (3)序號爲奇數的關鍵字順序有序,序號爲偶數的關鍵字順序有序;

(key1<key3<…,  key2<key4…)

    (4)前半個序列中的關鍵字順序有序,後半個序列中的關鍵字逆序有序:

(key1<key2<…<key└n/2┘,  key└n/2┘+1>…keyn)

10.5❺假設咱們把n個元素的序列{a1,a2,…,an}中知足條件ak<max{at}(1≤t<k)的元素ak稱爲「逆序元素」。若在一個無序序列有一對元素ai>aj(i<j),試問當將ai和aj相互交換以後(即序列由{…ai…aj…}變爲{…aj…ai…}),該序列中逆序元素的個數會增長嗎?爲何?

10.6❹奇偶交換排序以下所述:第一趟對全部奇數i,將a[i]和a[i+1]進行比較;第二趟對全部的偶數i,將a[i]和a[i+1]進行比較,若a[i]>a[i+1],則將二者交換;第三趟對奇數i;第四趟對偶數i,…,依次類推直至整個序列有序爲止。

  (1)試問這種排序方法的結束條件是什麼?

  (2)分析當初始序列爲正序或逆序兩種狀況下,奇偶交換排序過程當中所需進行的關鍵字比較的次數。

10.7❷不難看出,對長度爲n的記錄序列進行快速排序時,所需進行的比較次數依賴於這n個元素的初始排列。

  (1)n=7時在最好狀況下需進行多少次比較?請說明理由。

  (2)對n=7給出一個最好狀況的初始排列實例。

10.8❹試證實:當輸入序列已經呈現爲有序狀態時,快速排序的時間複雜度爲O(n2)。

10.9❹若將快速排序的一次劃分改寫爲以下形式,重寫快速排序的算法,並討論對長度爲N的記錄序列進行快速排序時在最好的狀況下所需進行的關鍵字間比較的次數(包括三者求中)。

  int partition(SqList &L, int low, int high, bool ci, bool cj)

  {

    int i, j, m;

    KeyType x;

    i = s;

    j = t;

    m = (s+t)%2;

    x = Midkey(s, m, t);             //三者取中值

    ci = cj = FALSE;

    while (i<j)

    {

      while((i<j) && (r[i].key<=x))

      {

        i = i + 1;

        if(r[i].key<r[i-1].key)

          r[i]↔r[i-1];

        ci = TRUE;

      }//while

      while((j>i) && (r[j].key>x))

      {

        j = j - 1;

        if(r[j].key>r[j+1].key)

        {

          r[j]↔r[j+1];

          cj = TRUE;

        }//if

        if(i<j)

        {

          r[i]↔r[j];

          if((i>s) && (r[i].key<r[i-1].key))

            ci = TRUE;

          if((j<t) && (r[j].key>r[j+l].key))

            cj = TRUE;

        }//if

      }//while

    }//while

    return i;

  }//partition

10.10❹閱讀下列排序算法,並與已學算法相比較,討論算法中基本操做的執行次數。

  void sort(SqList &r, int n)

  {

    i=1;

    while (i<n-i+1)

    {

      min = max = 1;

      for(j=i+1; j<=n-i+1; ++j)

      {

        if(r[j].key<r[min].key)

          min = j;

        else if(r[j].key>r[max].key)

          max = j;

      }//for

 

      if(min!=i)

        r[min]↔r[i];

 

      if(max!=n-i+1)

      {

        if(max==i)

          r[min]↔r[n-i+1];

        else

          r[max]↔r[n-i+1];

      }//if

      i++;

    }//while

  }//sort 

10.11❷試問:按錦標賽排序的思想,決出八名運動員之間的名次排列,至少需編排多少場次的比賽(應考慮最壞的狀況)?

10.12❶判別如下序列是否爲堆(小頂堆或大頂堆)。若是不是,則把它調整爲堆(要求記錄交換次數最少)。

  (1)(100, 86, 48, 73, 35, 39, 42, 57, 66, 21);

  (2)(12, 70, 33, 65, 24, 56, 48, 92, 86, 33);

  (3)(103, 97, 56, 38,  66, 23, 42, 12, 30, 52, 06, 20);

  (4)(05, 56, 20, 23, 40, 38, 29, 61, 35, 76, 28, 100)。

10.13❷一個長度爲n的序列,若去掉其中少數k(k<<n)個記錄後,序列是按關鍵字有序的,則稱爲近似有序序列。試對這種序列討論各類簡單排序方法的時間複雜度。

10.14❹假設序列由n個關鍵字不一樣的記錄構成,要求不經排序而從中選出關鍵字從大到小順序的前k(k<<n)個記錄,試問如何進行才能使所做的關鍵字間比較次數達到最小?

10.15❹對一個由n個關鍵字不一樣的記錄構成的序列,你可否用比2n-3少的次數選出這n個記錄中關鍵字取最大值和關鍵字取最小值的記錄?若能,請說明如何實現?在最壞狀況下至少進行多少次比較?

10.16❷已知一個含有n個記錄的序列,其關鍵字均爲介於0和n2之間的整數。若利用堆排序等方法進行排序,則時間複雜度爲O(nlogn)。若是將每一個關鍵字Ki認做Ki =Ki1n+Ki2,其中Ki1和Ki2都是範圍[0, n)中的整數,則利用基數排序只需用O(n)的時間。推廣之,若整數關鍵字的範圍爲[0, nk),則可獲得只需時間O(kn)的排序方法,試討論如何實現之。

10.17❸已知一個單鏈表由3000個元素組成,每一個元素是一整數,其值在1~1000000之間。試考察在第10章給出的幾種排序方法中,哪些方法可用於解決這個鏈表的排序問題?哪些不能?簡述理由。

10.18❷在進行多關鍵字排序的兩種方法中,試思考在什麼條件下MSD法比LSD法效率更高?

10.19❹假設某大旅店共有5000個牀位,天天需根據住宿旅客的文件製造一份花名冊,該名冊要求按省(市)的次序排列,每一省(市)按縣(區)排列,又同一縣(區)的旅客按姓氏排列。請你爲旅店的管理人員設計一個製做這份花名冊的方法。

10.20❸已知待排序的三個整數a,b和c(a≠b≠c≠a)可能出現的六種排列狀況的機率不等,且以下表所示:

a<b<c

b<a<c

a<c<b

c<a<b

b<c<a

c<b<a

0.13

0.24

0.08

0.19

0.20

0.16

  試爲該序列設計一個最佳排序方案, 使排序過程當中所需進行的關鍵字間的比較次數的指望值達到最小。

10.21❸分別利用折半插入排序法和2-路歸併排序法對含4個記錄的序列進行排序,畫出描述該排序過程的斷定樹,並比較它們所需進行的關鍵字間的比較次數的最大值。

10.22❺歸併插入排序是對關鍵字進行比較次數最少的一種內部排序方法,它可按以下步驟進行(假設待排序元素存放在數組x[1..n]中):

  (1)另開闢兩個大小爲┏n/2┓的數組small和large。從i=1到n-1,對每一個奇數的i,比較x[i]和x[i+1],將其中較小者和較大者分別依次存入數組small和large中(當n爲奇數時,small[┏n/2┓]=x[n]);

  (2)對數組large[1..┗n/2┛]中元素進行歸併插入排序,同時相應調整small數組中的元素,使得在這一步結束時達到large[i]<large[i+l],i=1,2,…,┗n/2┛-1,small[i]<large[i],i=1,2,…,┗n/2┛;

  (3)將small[1]傳送至x[1]中,將large[1]至large[┗n/2┛]依次傳送至x[2]至x[┗n/2┛+1]中;

  (4)定義一組整數int[i]=(2i+1+(-1)i)/3,i = 1,2,…,t-1,直至int[t]>┗n/2┛+1,利用折半插入依次將small[int[i+1]]至small[int[i]+1]插入至x數組中去。例如,若n=21,則獲得一組整數int[1]=1,int[2]=3,int[3]=5,int[4]=11,由此small數組中元素應按以下次序:small[3],small[2],small[5],small[4],small[11],small[10],…,small[6],插入到x數組中去。

  試以n=5和n=11手工執行歸併插入排序,並計算排序過程當中所做關鍵字比較的次數。

 

轉載註明出處:原文連接

 

//基礎知識題部分待有時間再畫吧...

 

2、算法設計題

10.23❷試以L.r[k+1]做爲監視哨改寫教科書10.2.1節中給出的直接插入排序算法。其中,L.r[1..k]爲待排序記錄且k<MAXSIZE。

10.24❸試編寫教科書10.2.2節中所述2-路插入排序的算法。

10.25❸試編寫教科書10.2.2節中所述鏈表插入排序的算法。

10.26❷以下所述改寫教科書10.3節中所述起泡排序算法:將1.4.3節的算法中用以起控制做用的布爾變量change改成一個整型變量,指示每一趟排序中進行交換的最後一個記錄的位置,並以它做爲下一趟起泡排序循環終止的控制值。

10.27❷編寫一個雙向起泡的排序算法,即相鄰兩遍向相反方向起泡。

10.28❹修改10.27題中要求的算法,請考慮如何避免將算法寫成兩個並在一塊兒的類似的單向起泡的算法段。

10.29❹按10.6題所述編寫奇偶交換排序的算法。

10.30❹按下述原則編寫快排的非遞歸算法:

  (1)一趟排序以後,若子序列已有序(無交換),則不參加排序,不然先對長度較短的子序列進行排序,且將另外一子序列的上、下界入棧保存;

  (2)若待排記錄數≤3,則再也不進行分割,而是直接進行比較排序。

10.31❹編寫算法,對n個關鍵字取整數值的記錄序列進行整理,以使全部關鍵字爲負值的記錄排在關鍵字爲非負值的記錄以前,要求:

  (1)採用順序存儲結構,至多使用一個記錄的輔助存儲空間;

  (2)算法的時間複雜度爲O(n);

  (3)討論算法中記錄的最大移動次數。

10.32❺荷蘭國旗問題:設有一個僅由紅、白、藍三種顏色的條塊組成的條塊序列。請編寫一個時間複雜度爲O(n)的算法,使得這些條塊按紅、白、藍的順序排好,即排成荷蘭國旗圖案。

10.33❸試以單鏈表爲存儲結構實現簡單選擇排序的算法。

10.34❸已知(k1,k2,…,kp)是堆,則能夠寫一個時間複雜度爲O(logn)的算法將(k1,k2,…,kp,kp+1)調整爲堆。試編寫「從p=1起,逐個插入建堆」的算法,並討論由此方法建堆的時間複雜度。

10.35❸假設定義堆爲知足以下性質的徹底三叉樹:(1)空樹爲堆;(2)根結點的值不小於全部子樹根的值,且全部子樹均爲堆。編寫利用上述定義的堆進行排序的算法,並分析推導算法的時間複雜度。

10.36❹可按以下所述實現歸併排序:假設序列中有k個長度爲≤l的有序子序列。利用過程merge(參見教科書10.5節)對它們進行兩兩歸併,獲得┏k/2┓個長度≤2l的有序子序列,稱爲一趟歸併排序。反覆調用一趟歸併排序過程,使有序子序列的長度自l=1開始成倍地增長,直至使整個序列成爲一個有序序列。試對序列實現上述歸併排序的遞推算法,並分析你的算法的時間複雜度。

10.37❹採用鏈表存儲結構,重作10.36題。

10.38❸ 2-路歸併排序的另外一策略是,先對待排序序列掃描一遍,找出並劃分爲若干個最大有序子列,將這些子列做爲初始歸併段。試寫一個算法在鏈表結構上實現這一策略。

10.39❺已知兩個有序序列(a1,a2,…,am)和(am+1,am+2,…,an),而且其中一個序列的記錄個數少於s,且s=┗根號n┛。試寫一個算法,用O(n)時間和O(1)附加空間完成這兩個有序序列的歸併。

10.40❺假設兩個序列都各有至少s個記錄,重作10.39題。

10.41❹假設有1000個關鍵字爲小於10000的整數的記錄序列,請設計一種排序方法,要求以儘量少的比較次數和移動次數實現排序,並按你的設計編出算法。

10.42❹序列的「中值記錄」指的是:若是將此序列排序後,它是第┌n/2┐個記錄。試寫一個求中值記錄的算法。

10.43❸已知記錄序列a[1..n]中的關鍵字各不相同,可按以下所述實現計數排序:另設數組c[1..n],對每一個記錄a[i],統計序列中關鍵字比它小的記錄個數存於c[i],則c[i]=0的記錄必爲關鍵字最小的記錄,而後依c[i]值的大小對a中記錄進行從新排列,試編寫算法實現上述排序方法。

10.44❸假設含n個記錄的序列中,其全部關鍵字爲值介於v和w之間的整數,且其中不少關鍵字的值是相同的。則可按以下方法進行排序:另設數組number[v..w]且令number[i]統計關鍵字取整數i的記錄數,以後按number重排序列以達到有序。試編寫算法實現上述排序方法,並討論此種方法的優缺點。

10.45❸試編寫算法,藉助「計數」實現基數排序。

10.46❸序列b的每一個元素是一個記錄,每一個記錄佔的存儲量比其關鍵字佔的存儲量大得多,於是記錄的移動操做是極爲費時的。試寫一個算法,將序列b的排序結果放入序列a中,且每一個記錄只拷貝一次而無其餘移動。你的算法能夠調用第10章中給出的任何排序算法。思考:當記錄存於鏈表中時,若但願利用快速排序算法對關鍵字排序,從而最後實現鏈表的排序,如何模仿上述方法實現?

相關文章
相關標籤/搜索