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+
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
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.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] /**/}}
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
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
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)
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 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-
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