注意:
次算法不涉及记录的移动,它类似地址表排序,因为COUNT表确定这些记录最后安排,但是由于COUNT[j]高速我们往何处移动Rj,而不是哪一个记录应当被移动Ri的位置,故它与地址表排序略有不同。
通过计数进行排序,还有另外一个方法,从有效的观点看,它十分重要的:
它主要应用于许多相同的键码出现,且所有的键码都落入范围u≤kj≤v的情况,其中(v-u)很小。
这些假定看来十分严格的限制,但是事实上将看到这一思想有不少的应用。
列如,如果把这个算法的应用与键码的头几位数,而不是整个键码,则这个文件被部分地排序,而且这项任务将相当简单。
1.2通过插入进行排序
有一类重要的排序技术,是以1.2节开头处提到的“玩桥牌者”的方法为基础的,在考察记录Rj之前,假定以前的记录
已经排好序,然后已经把Ri插入到已经排好的诸多记录的适当位置。
这个基本主题可以由若干有趣的变形。
1.2.1直接插入
最简单的插入排序也是最显然的。
假定
,而且已经把记录
重新排好序,使得
把新键码Kj依次地和Kj-1,...,k3,k2..进行比较,直到发现Rj应当插入到Ri和Ri+1处。
如下列算法所示那样,宜于把比较和移动操作组合在一起,互相穿插,由于Rj“被安放到适当的层次中区”,这种排序方式通常称为筛选或陷入技术。
算法S(直接插入排序)重新安排记录
到适当位置;在完成排序之后,它们的键码是有序的,即有
。
S1[对j进行循环]对于j=2,3,...,N实施步骤S2到S5;然后终止本算法。
S2[给i,K,R赋值]置i←j-1,K←Kj,R←Rj
S3[比较K:
Ki]如果
则转向步骤S5.
S4[移动Ri,i减值]置Ri+1←Ri,然后i←i-1。
如果i>0,则返回到步骤S3。
S5[R进入Ri+1]置Ri+1←R。
1.2.2二叉插入和两路插入
在一个直接插入排序期间,在处理第j个记录时,平均说来要把它的键码大约同1/2j个此前已排好的键码进行比较,因此所实施比较的总数大约是1/2(1+2+3+...+N)=1/4N2,当N适当大时,这就已经非常之大了。
在6.2.1小节,将研究“二分查找”技术,该技术使我们能够在仅仅lgN次仔细选择的比较之后,就指出在那里插入第j项。
例如,当插入第64个记录时,可以由对K64和K32进行比较开始。
如果是小于,则就把它同K16进行比较,但如果是大于,则就把它同K65进行比较,等等。
于是仅仅做6次比较之后,就可知道R64应查如得位置。
插入所有N项所作的比较总数就大学时NlgN,这是对于1/4N2的实质性的改进。
而6.2.1小节表示,它早在1946年就由JohnMauchly在计算机排序的第一个公开讨论中述及。
二叉插入的困难时,它只解决问题的一半。
在已经发现记录Rj应插入到那里之后,仍然需要移动大的1/2j个此前已排序好的记录,以便Ri腾出位置,所以总共的运行时间实质上仍同N2成正比。
当然,一个灵巧的程序员可以相处各种方式来减少所需要移动的数量;头一个这样的技巧,如表2所示,是早在50年代时就提出的,表中排序的头一项被放置在一个输出区域的中心,而且通过向右或向左移动腾出空间。
此法比普通二叉插入节省一半运行时间,其代价是程序稍微复杂一点,使用此法时,还可以不必使用N个记录所需要的更多的空间;但对于这个“两路”插入的方法,将不作更详细的叙述因为已有更多有趣的方法。
1.2.3Shell方法
如果有这样的一份排序算法,它一次只把诸多项目移动一个位置,则它的平均运行时间最好也是同N2的成比例。
因为在这个排序过程中每个记录都必须平均遍历1/3N个位置。
因此,如果直接对插入作实质性的改进,就需要一种新原理,它是这些记录作长距离的跳跃,而不是一些短促的小步移动。
这样一个方法是由Donald.L.Shell于1959年提出的,我们称它为Shell排序,表3说明该法的一般想法:
首先把这16个记录分成8组即(R1,R9),(R2,R10),...,(R8,R16)。
分别对每组记录进行排序。
使我们进到表3的第二行,这称为“第一次扫描”。
表3增量递减排序
Shell排序也叫做“减少增量的排序”,因为每一遍通过增量h来确定,使得我们对相距h个单位进行排序。
任何序列h1,hi-1,..,hn都可以使用此方法,只要最后的增量h0=1就行。
小结
既然我们已经接近着极为冗长的一章结尾,我们最好“整理出”已研究过的最为重要的事实。
用于排序的一个算法,是一个这样的过程,它重新安排一个文件的所有记录,使得其码处于递增的次序,这有序的排列是有用的,因为它把相同的记录放到一起,允许有效的处理按同一个键码排好的多个文件,这导致了有效的检索方法,而且是计算机的删除看上去不那么的混乱。
如果无论是对那一种应用,或无论正在使用什么样的计算机,仅仅有一两种排序方法,它比所有的排序方法都好,那么,事情倒好结局,事实上,每种方法都有各自的优点。
因此所有的方法都要去记,因为在特地的环境中,它们是最好的。
参考文献
[1]Bell,D.Theprinciplesofsorting.TheComputerJournal1(1958):
71–77.
[2]Bose,R.C,andNelson,R.J.Asortingproblem.JournaloftheACM(JACM)9,2(1962):
28–296.
[3]Halstead,M.H.ElementsofSoftwareScience.Operating.andProgrammingSystemsSeries,vol.7.Elsevier,1977:
71–77.
Sorting
1InternalSorting
Manydifferentsortingalgorithmshavebeeninvented,andwewillbediscussingabout25oftheminthisbook.Thisratheralarmingnumberifmethodsisactuallyonlyafractionthealgorithmsthathavebeendevisedsofar;manymethodswhicharenowobsoletewillbeomittedfromourdiscussiong,irmentionedonlybrieflywhyaretheresomanysortingmethods?
Forcomputerprogrammingthisisaspecialcaseofquestion,”whyaretheresomanyxmethods?
”,wherexrangesoverthesetofproblems;andtheansweristhateachmethodshasitsownadvantagesanddisadvantages,sothatitoutperfomstheohersonsomeconfigurationofdataandhardware.Unfortunately,thereisnoknow“best”waytosort;therearemanybestmethods,dependingonwhatistobesortonwhatmachineforwhatpurpose.InthewordsofPudyardKiplin,’therearenineandsixtywaysofconstructingtriballays,andeverysingleoneofthemisright.”
Itisagoodideatolearnthecharacteristicsofeachsortingmethod,sothataninerlligentchoicecanbemadeforparticularapplicationsFortunately,itisnotaformidabletasktolearnthesealgorithms,sincetheyareinerrelatedininterstingways.
Atthebeginningofthischaperwedefinethebasicterminnologyandnotationtobeusedinourstudyofsorting:
therecords
(1-1)
Aresortingintonondereasingorderoftheirkeys
esentiallybydiscoveringapermutationp
(1)p
(2)...p(N)suchthat
(1-2)
Inthepresentsectionweareconcernedwithinernalsorling,whenthenumberofrecordstobesortingissmallenoughthattheentireprocesscanbeperformedinacomputershigh-speedmemory.
Insomecaseswillwantrecordstobephysiscallyrearrangedinmemorysothattheirkeysareinorder,whileinorhercasesinmaybesufficientmerelytohaveanauxiliarytableofsomesortwhichspecifiesthepermutation.Iftherecordsand/orthekeyseachtakeupquiteafewtablewordsofcomputermemoty,itisoftenbettertomakeupanewtableoflinkaddresseswhicpointtotherecords,andtomanipulatetheselinkaddressesinsteadofmovingthebulkyrecordsaround.Thismethodiscalledaddresstablesorting.Ifthekeyisshortbutthesatelliteinformationoftherecordsislong,thekeymaybeplacedwiththelinkaddressesforgreaterspeed;thisiscalledkysorting.Othersortingschemesutilizeandauxiliarylinkfieldwhichisincludedineachrecord;theselinksaremanipulatedinsuchawaythat,inthefinalresult,therecordsarelinkedtogethertoformastraightlinearresult,therecordsarelinktogethertoformastraightlinearlist,witheachlinkpointingtothefollowingrecord.
Allofsortingmethodswhichweshallexamine“indepth”willbeillustrateinfourways,bymeansof
a)anEnglish-languagedescriptionofthealgotithm,
b)flowdiagram,
c)aMIXprogram,
d)anexampleofthesortingmethodappliedtoagivensetofnumber.
AnanalysisoftherunningtimeofeachsortingwillbegivewiththeMIXprograms.
1.1Sortingbycounting
Asasimpleexampleofthewayinwhichweshallstudyinernalsortingmethods,lectusconsiderthe“ounting”ideamentionednearthebeginningofthissecion.Thissimplemethodisbasedontheideathatthejthkeyinthefinalsortedsequenceisgreaterthanexactly(j--1)oftheotherkeys.Puttingthisanotherway.ifweknowthatacertainkeyexceedsexactly27others,thecorrespondingrecordshouldgointoposition28aftersorting.Sotheideaistocompareeachpairofkeys,countinghowmanyarelessthaneachparticularone.
Theobbiouswaytodothecomparisonsisto
.For
For
Butitiseasytoseethatoverhalfofthesecomparisonareredundat,sinceitisunnessarytocompareakeywithitself,anditisunnessarytocompareKawithKbandlatertocompare..with....weneedmerelyto
For
For
Algorithmc(comparisoncounting)
ThisalgorithmsortsCOUNT[1],...,COUNT[N]onthekeys
bymaintaininglessthanagivenkey.Aftertheconclusionofthealgorithm,count[j]+1specifiesthefinalpositionofrecord
C1[clearCounts]SetCount[1]throughCOUNT[N]tozero.
C2[Looponi.]PerformstepC3,fori=N,N-1,...,2;thenterminatethealgorithm.
C3.[Looponj.]PerformstepC4,forj=i-1,i-2,...,1.
C4.[CompareKi,Kj.]IfKiNotethatthisalgorithminvolvesnomovementofrecords.Itissimilartoanaddresstablesort,sincetheCOUNTtablespecifiesthefinalarrangementofrecords;butitissomewhatdifferrentbecauseCOUNT[j]tellsuswheretomoveRj,insteadofindicatingwhichrecordshouldbemovedintotheplaceofRj.(Thusthe“inverse”ofthepermutationp
(1)...p(n)isspecifiedintheCOUNTtable;seeSection1.1.1).
Inourdiscussionprecedingthisalgorithmwefailedtoconsidertheposibilityofequalkeys.Thisisapotentiallyseriousomission,forifequalkeyscomplicatedtoequalCOUNTsthefinalrearrangementofrecordswouldberathercomplicated.Fortunately,asexercise2shows,AlgorithmCgivesthecorrectresultnomatterhowmanyequalkeysarepresent.
ProgramC(Comparisoncounting).
ThefollowingMTXimplementationofAlgorithmCassumesthatRjisstoredinlocationINPUT+j,andCOUNT[j]inlocationCOUNT+j,for1≤j≤N;rI1=i;rI2=j;rA=Ki=Ri;rX=COUNT[i].
Therunningtimeofthisprogramis13N+6A+5B-4units,whereNisthenumberofrecords;AisthenumberofchoicesoftwothingsfromasetofNobjects,namely(
)=(N2-N)/2。
1.2SortingbyInsertion
Oneofimportantfamiliesofsortingtechniquesisba