Click here to load reader

第九章 排序

  • Upload
    nuwa

  • View
    52

  • Download
    0

Embed Size (px)

DESCRIPTION

第九章 排序. ⒈ 教学内容 9.1 基本概念 9.2 插入排序 9.3 交换排序 9.4 选择排序 9.5 二路归并排序 9.6 基数排序 9.7 外排序 ⒉教学目的及要求 ⑴领会排序的基本思想和基本概念; ⑵理解并掌握插入排序、冒泡排序、快速排序、直接选择排序、堆排序、归并排序和基数排序的基本思想、步骤、算法及时空效率分析; ⑶了解外排序的定义和基本方法。. 3 、教学重点 ⑴排序基本概念及内排序和外排序、稳定排序和非稳 定排序的区别; ⑵插入排序的基本思想、基本步骤和算法; ⑶冒泡排序的基本思想、基本步骤、算法和算法分析; - PowerPoint PPT Presentation

Citation preview

  • 9.1 9.2 9.3 9.4 9.5 9.6 9.7

  • 3 4

  • 9.1 (Sorting)B-B+

  • 9.2 9.2.1 nrr[1].keyr[2].keyr[n].key
  • 10.1 r[0]=r[j] //r[j]r[0]r[j] i=j-1 //ir[0] i
  • 10.1 r[1] r[2] r[3] r[4] r[5] 2 10 18 25 9 r[5]j=5r[0]=r[j]i=j-1 2 10 18 25 r[i+1]i=4r[0] < r[i]r[i+1]=r[i]i-- 2 10 18 25 i=3r[0] < r[i]r[i+1]=r[i]i-- 2 10 18 25 i=2r[0] < r[i]r[i+1]=r[i]i-- 2 10 18 25 i=1r[0] r[i]r[i+1]=r[0] 2 9 10 18 25

  • nnn 10.2void InsertSort(S_TBL &p){for(i=2ilengthi++)if(p->elem[i].key < p->elem[i-1].key) /*elem[i]*/{p->elem[0]=p->elem[i] /**/for(j=i-1p->elem[0].key < p->elem[j].keyj--)p->elem[j+1]=p->elem[j] /**/p->elem[j+1]=p->elem[0]/**/}}

  • n-1 12 =n-1 =2(n-1) jjjj+2

  • jj/2j/2+2 O(n2)

  • 9.2.1 n2/4

  • low=1high=j-1r[0]=r[j] // j-1j // low>high lowhighm=(low+high)/2 // */ r[0].key
  • 10.3void InsertSort(S_TBL *s){/* s */for(i=2ilengthi++){s->elem[0]=s->elem[i] /* */low=ihigh=i-1 /* */while(lowelem[0].key>s->elem[mid].key)low=mid+1 /* */else high=mid-1 /* */}/* while */for(j=i-1j>=high+1j--) /* high+1 */s->elem[j+1]=s->elem[j] /* */s->elem[high+1]=s->elem[0] /* */}/* for */}/* InsertSort */

  • O(n2)9.2.3

  • #define SIZE 200typedef struct{ ElemType elem /**/ int next /**/ }NodeType /**/typedef struct{ NodeType r[SIZE] /**/ int length /**/ }L_TBL /**/ 00

  • 10.2 keynexti=1i=2i=3keynextkeynextkeynext

    012345678MAXINT49386597761327490--------

    MAXINT493865977613274910-------

    MAXINT4938659776132749201------

    MAXINT49386597761327492310-----

  • i=4i=7i=8keynextkeynextkeynexti=5keynexti=6keynext

    MAXINT493865977613274923140----

    MAXINT493865977613274963150572-

    MAXINT4938659776132749681504723

    MAXINT4938659776132749231504---

    MAXINT49386597761327496315042--

  • iiij

  • 10.31. j=l->r[0].nexti=1 //2. i=l->lengtha. i=jj=l->r[j].nexti++(2) //b. j>il->r[i].eleml->r[j].elem // p=l->r[j].next // l->r[j].next=l->[i].nextl->[i].next=j // j=pi++(2) // c. j
  • 10.3 keynexti=1i=2i=3keynextkeynextkeynextj=6j=7i=(2),7

    012345678MAXINT4938659776132749681504723

    MAXINT13386597764927496(6)1504823

    MAXINT13276597764938496(6)(7)504813

    MAXINT13273897764965496(6)(7)(7)04853

  • i=4i=7keynextkeynexti=5keynexti=6keynextj=(1),6j=8j=(3),7j=(5),8 ii+12nO(n2)

    MAXINT13273849769765496(6)(7)(7)(6)4053

    MAXINT13273849496576976(6)(7)(7)(6)(8)(7)(8)0

    MAXINT13273849499765766(6)(7)(7)(6)(8)054

    MAXINT13273849496597766(6)(7)(7)(6)(8)(7)04

  • 9.2.3 (Shells Sort) 1959D.L.Shell nnO(n) 1. t1t2tkti>tjtk=1 2. kk 3. tim1

  • 10.4 3980764113295078301110074186531P=5{3929100}{80507}{767841}{413086}{1311}

    3980764113295078301110074186

  • P=3{2930501378}{7117610086}{41394180} P=1

    2974130113950764113100807886

    1373929114130764150868078100

    7111329303941415076788086100

  • 10.5void ShellInsert(S_TBL &pint dk){/*dkdk*/for(i=dk+1ilengthi++)if(p->elem[i].key < p->elem[i-dk].key) /*elem[i]*/{p->elem[0]=p->elem[i] /**/for(j=i-dkj>0&&p->elem[0].key < p->elem[j].keyj=j-dk)p->elem[j+dk]=p->elem[j] /**/p->elem[j+dk]=p->elem[0] /**/}}

  • void ShellSort(S_TBL *pint dlta[]int t){/*dlta[01t-1]*p*/for(k=0k
  • 9.3 9.3.1(Bubble Sort) 1
  • r[i].keyr[i+1].keyr[i].keyr[i+1].key r[i].key>r[i+1].key r[0]=r[i]r[i]=r[i+1]r[i+1]=r[0] r[i]r[i+1] i=i+1 nr[n]n-1r[n-1]n

  • 10.6 j=n //n jr[i+1].key r[i]r[i+1] r[i]r[i+1] i=i+1

  • n-1jj-1

  • 9.3.2 () 1p
  • low
  • 10.7int Partition(S_TBL *tbl,int low,int high) /**/{ /*tbltbl->[lowhigh]()()*/tbl->r[0]=tbl->r[low]; /**/pivotkey=tbl->r[low].key; /**/while(low=pivotkey) high--;tbl->r[low]=tbl->r[high]; /**/while(lowr[high].keyr[low]=tbl->r[high]; /**/}tbl->r[low]=tbl->r[0]; /**/return low; /**/}

  • 10.5 r[1] r[2] r[3] r[4] r[5] r[6] r[7] r[8] r[9] r[10] 49 14 38 74 96 65 8 49 55 27 low=1high=10 r[0]=r[low] 14 38 74 96 65 8 49 55 27 low high highr[0].key 27 14 38 74 96 65 8 49 55 low high

  • lowr[0].key 27 14 38 96 65 8 49 55 74 low high highr[0].key 27 14 38 8 96 65 49 55 74 low high lowr[0].key 27 14 38 8 65 96 49 55 74 low high

  • highr[0].key 27 14 38 8 65 96 49 55 74 low high lowr[0].key 27 14 38 8 65 96 49 55 74 low highlow=high 27 14 38 8 49 65 96 49 55 74

  • 10.8void QSort(S_TBL *tbl,int low,int high) /**/{/*tbltbl->[lowhigh]*/if(low
  • O(log2n)O(n) nnO(n)T(n)n T(n)cn+2T(n/2) c cn+2(cn/2+2T(n/4))=2cn+4T(n/4) 2cn+4(cn/4+T(n/8))=3cn+8T(n/8) cnlog2n+nT(1)=O(nlog2n)

  • O(n2) O(nlog2n)

  • 9.4 nn-19.4.1 nn-1iin-i+1i

  • 10.9void SelectSort(S_TBL *s){for(i=1ilengthi++){/* length-1 */for(j=i+1t=ijlengthj++){ /* ilength-n+1 */if(s->elem[t].key>s->elem[j].key)t=j /* t */} s->elem[t]s->elem[i] /* i */}} ((n*(n+1))/2O(n2)

  • 9.4.2 n2n-22n-1()

  • 839110.616(n=24)919167728347471380916751622972463147258379699167627247837991 23+22+21+20=24-1=n-1

  • 8380838067728347471380067516229724631472583796980676272478379 834log2nnn(n1)log2nn1O(nlog2n)nn-1

  • 9.4.3 (Heap Sort) n k1k2kn91472436533085161236854730532491 ()()

  • nnn()n-1n() 1. n 2. n-1

  • mm-1()

  • 10.6123685473053249191368547305324n 2436854730539124368547915330a.1291b. c. d.

  • n

  • 10.75336914712243085a. 8 53369147122430855336854712243091b.4c.3

  • 5336854730241291d.25336854730241291e.1236854730245391nnn-1n-1

  • 10.10void HeapAdjust(S_TBL *hint sint m){/*r[sm]r[s]s*/rc=h->r[s]for(j=2*sjr[s]=h->r[j] s=j /* s */}h->r[s]=rc /* */}

  • void HeapSort(S_TBL *h){for(i=h->length/2i>0i--) /* r[1..length] */HeapAdjust(hih->length)for(i=h->lengthi>1i--){h->r[1]h->r[i] /* */HeapAdjust(h1i-1) /*r[1..i-1]*/}}k2(k-1)k( log2(n1) + log2(n2) + + log22 ) < nlog2n4nO(nlog2n)

  • 9. 5 r[ut]r[uv-1]r[vt]v-ut-v+1 i=uj=vk=u // i>v j>t // //r[i]r[j]rf r[i].key
  • 9. 5 r[ut]r[uv-1]r[vt]v-ut-v+1 i=uj=vk=u // i>v j>t // //r[i]r[j]rf r[i].key
  • 10.11

    void Merge(ElemType *rElemType *rfint uint vint t){for(i=uj=vk=ui

  • 12n.11n1 10.12void MergeSort(S_TBL *pElemType *rf){/**p*rf*p*/ElemType *q1*q2q1=rfq2=p->elem

  • for(len=1lenlengthlen=2*len) /*q2q1*/{for(i=1i+2*len-1lengthi=i+2*len)Merge(q2q1ii+leni+2*len-1) /**/if(i+len-1length)Merge(q2q1ii+lenp->length) /**/elseif(ilength)while(ilength) /**/q1[i]=q2[i]q1q2 /*q2q1*/if(q1!=p->elem) /**p*/for(i=1ilengthi++)p->elem[i]=q1[i]}}

  • .10.13void MSort(ElemType *pElemType *p1int sint t){/*p[st]p1[st]*/if(s==t) p1[s]=p[s]else{m=(s+t)/2/**p*/MSort(pp2sm)/*p[sm]p2[sm]*/MSort(pp2m+1t)/*p[m+1t]p2[m+1t]*/Merge(p2p1sm+1t)/*p2[sm]p2[m+1t]p1[st]*/}}void MergeSort(S_TBL *p){/**p*/MSort(p->elemp->elem1p->length)}

  • O(n) nn-1log2nnO(nlog2n)

  • 9.6 9.6.1 52 < < < 2 < 3 < 4 < 5 < 6 < 7 < 8 < 9 < 10 < J < Q < K < A2,3,...,A2,3,...,A2,3,...,A2,3,...,A

  • 144 21313(23...A)134()2344

  • nd{k1k2kd}{k1k2kd}r[i]r[j](1ijn) k1kd (Most Significant Digit first)MSDk1k1k2kdMSD

  • (Least Significant Digit first)LSDkdkd-1k1LSD9.6.2 445(09az)RADIX1026LSD RADIXdRADIX

  • 10.8278109063930589184505269008083e[0]e[1]e[2]e[3]e[4]e[5]e[6]e[7]e[8]e[9]269589109008278505184083063930f[0]f[1]f[2]f[3]f[4]f[5]f[6]f[7]f[8]f[9](a)(b)

  • 930063083184505278008109589269e[0]e[1]e[2]e[3]e[4]e[5]e[6]e[7]e[8]e[9]589184083930f[0]f[1]f[2]f[3]f[4]f[5]f[6]f[7]f[8]f[9](c)(d) 109008505269063278505008109930063269278083184589(e)

  • e[0]e[1]e[2]e[3]e[4]e[5]e[6]e[7]e[8]e[9]f[0]f[1]f[2]f[3]f[4]f[5]f[6]f[7]f[8]f[9](f) 083063008589505930008063083109184269278505589930(g) 184109278269

  • 10.14#defineMAX_KEY_NUM8/**/#defineRADIX10/**/#defineMAX_SPACE1000/**/typedefstruct{KeyType keys[MAX_KEY_NUM]/**/InfoTypeotheritems/**/intnext/**/}NodeType/**/typedefstruct{NodeTyper[MAX_SPACE] /*r[0]*/intkeynum/**/intlength/**/}L_TBL/**/typedefintArrayPtr[radix]/**/

  • void Distribute(NodeType *sint iArrayPtr *fArrayPtr *e){/*ltblr(kye[0]keys[1]keys[i-1]))*//*ikeys[i]RADIXkeys[i]f[0RADIX-1]e[0RADIX-1]*/for(j=0j
  • void Collect(NodeType *rint iArrayPtr fArrayPtr e){/*keys[i]f[0RADIX-1]*e[0RADIX-1]*/for(j=0!f[j]j=succ(j)) /*succ*/r[0].next=f[j]t=e[j] /*r[0].next*/while(j
  • void RadixSort(L_TBL *ltbl){/*ltblltbl->r[0]*/for(i=0ilengthi++) ltbl->r[i].next=i+1ltbl->r[ltbl->length].next=0/*ltbl*/for(i=0ikeynumi++) /**/{Distribute(ltbl->rife) /*i*/Collect(ltbl->rife) /*i*/}}

    ndradixO(d(n+radix))O(n)O(radix)d 2*radixn

  • 9.7

    9.7.1 nk(segment)()

  • 10000 1010 R1R10 1000

  • 10m2- 2-MergeMerge//2005050/500/

  • = () m*tis + d*tio + s*utmg tistio/utmgumsd/100002- 10*tis+500*tio+4*10000tmg tiotiotmgd

  • d105-(55)/2100+100=3002-200/R1R2R3R4R5R6R7R8R9R10R1R2/smk-kms

  • 9.7.2 ks/kutmg 2-uMergeuu-1k-ukkk-1k-1u(u-1)(k-1)ns(k-1)(n-1)

  • mkk kk-(Tree of Loser)k kk

  • 5(a)5-ls[04]()5ls[1]ls[0]

  • ls[3]b1b2b2b1b3(b3b3b4b0)ls[1]b1b3 (b)32k- k k-

  • 10.15typedef int LoserTree[k]; /**/typedef struct{KeyType key;}ExNode,External[k]; /**/void K_Merge(LoserTree *ls,External *b)/*k-*/{/*ls0k-1kb[0]b[k-1]kk*/for(i=0;i
  • while(b[ls[0]].key!=MAXKEY){q=ls[0]; /*q*/output(q); /*q(b[q].key)*/ input(b[q].key); /*q*/Adjust(ls,q); /**/}output(ls[0]); /*MAXKEY*/}void Adjust(LoserTree *ls,int s) /**/{/*b[s]ls[0]*/t=(s+k)/2; /*ls[t]b[s]*/while(t>0){if(b[s].key>b[ls[t]].key) sls[t];/*s*/ t=t/2;}ls[0]=s;}

  • void CreateLoserTree(LoserTree *ls) /**/{/*b[0]b[k-1]lskkls*/b[k].key=MINKEY; /*MINKEY*/for(i=0;i0;i--) Adjust(ls,i); /*b[k-1],b[k-2],,b[0]*/} kk