專利名稱:通過計(jì)算實(shí)現(xiàn)分級(jí)定位的排序和查找的方法)的制作方法
一種計(jì)算機(jī)對(duì)于一組完全無序的數(shù)據(jù)進(jìn)行排序和一組有序的數(shù)據(jù)進(jìn)行查找的方法。
對(duì)于完全無序的一組數(shù)進(jìn)行排序,理想化的方法就是對(duì)于待排序的n個(gè)數(shù),每取出一個(gè)數(shù)通過計(jì)算后,馬上能準(zhǔn)確找到其所應(yīng)該排在的位置,當(dāng)n個(gè)數(shù)全部經(jīng)過一趟計(jì)算后,全部找到其所應(yīng)該排在的位置,這樣就完成了排序。雖然。理想排序應(yīng)該只要進(jìn)行n次操作,其時(shí)間復(fù)雜度為O(n),并且應(yīng)該有n個(gè)變量存放待排序數(shù)據(jù),即輔助空間為O(n)。目前,對(duì)于完全無序的數(shù)據(jù)進(jìn)行排序的方法,時(shí)間復(fù)雜度較好的有快速排序、堆排序、希爾排序、基數(shù)排序和歸并排序5種,其中快速排序、堆排序、希爾排序和歸并排序的時(shí)間復(fù)雜度為O(n*logn),而且前三種是不穩(wěn)定排序;基數(shù)排序的時(shí)間復(fù)雜度為O(d*n),其中d為關(guān)鍵字的個(gè)數(shù)。
本發(fā)明的目的是要提供一種效率高且穩(wěn)定的排序方法,使對(duì)于完全無序的數(shù)據(jù)進(jìn)行排序,其時(shí)間復(fù)雜度降低至接近O(n),即接近理想化的排序。查找也是要通過計(jì)算,首先直接在n個(gè)數(shù)中確定一個(gè)很小的查找范圍,以利于提高查找速度。
本發(fā)明是一種通過計(jì)算實(shí)現(xiàn)分級(jí)定位的排序和查找的方法,以下簡(jiǎn)稱為分級(jí)排序和查找,排序是將一組無序的關(guān)鍵字key排列成有序的關(guān)鍵字,查找是在關(guān)鍵字已經(jīng)排序成有序的一組關(guān)鍵字中找到要找的某個(gè)關(guān)鍵字,本發(fā)明的特征是將排序分為兩個(gè)過程,首先完成分級(jí),然后進(jìn)行級(jí)內(nèi)排序和數(shù)據(jù)收集,完成完全排序。設(shè)有n個(gè)數(shù)A(1).Key…A(j).Key…A(n).key待排序,第一個(gè)過程是按照關(guān)鍵字大小分為m個(gè)級(jí)別,有以下步驟
①設(shè)定一組可以通過計(jì)算得到i和k而唯一確定的變量,如數(shù)組類型的變量B(i,k)和層次記錄數(shù)組類型變量B(i),簡(jiǎn)稱為可分級(jí)變量,其中的下標(biāo)i用于表示級(jí)別大小,簡(jiǎn)稱為分級(jí)變量,如果希望將n個(gè)數(shù)A(1).Key…A(j).Key…A(n).Key的關(guān)鍵字key按大小分為m個(gè)等級(jí),那么就設(shè)定分級(jí)變量為m個(gè),即i=1…m。為敘述方便起見,以記錄數(shù)組類型變量B(i)展開說明。B(i)中的域C(k)是一個(gè)數(shù)組變量,是用于存放關(guān)鍵字的變量,其中的下標(biāo)k是用于統(tǒng)計(jì)放入i級(jí)變量B(i)中的關(guān)鍵字個(gè)數(shù)的計(jì)數(shù)器,稱為計(jì)數(shù)變量,(k=1…&,&表示結(jié)束字所對(duì)應(yīng)的序號(hào))。將關(guān)鍵字分級(jí)的方法很多,可以按各種分布函數(shù)分級(jí),如正態(tài)分布函數(shù)、指數(shù)分布函數(shù)、t分布函數(shù)、F分布函數(shù)、x2分布函數(shù)、泊松分布函數(shù)、均勻分布函數(shù);②計(jì)算出待排序關(guān)鍵字中的p個(gè)最大關(guān)鍵字keyMAX、MAX1、MAX2…MAXp、和q個(gè)最小關(guān)鍵字keyMIN、MIN1、MIN2…MINq;③計(jì)算出關(guān)鍵字的最大值和最小值后,包含在此范圍內(nèi)的字可視為關(guān)鍵字,在此范圍以外的字可視為結(jié)束字END,比如MAX+1或MIN-1;首先用結(jié)束字對(duì)所有的可分級(jí)變量賦初值,令B(i).C(1)=MAX+1,(i=1…m)。
④根據(jù)最大關(guān)鍵字和最小關(guān)鍵字以及待排序個(gè)數(shù)n,設(shè)計(jì)出分級(jí)函數(shù)F(A(j).Key),分級(jí)函數(shù)為F(A(j).Key)=1+int((m-1)*G(A(j).Key)),其中G(A(j).Key)表示各種分布函數(shù)。每當(dāng)取出一個(gè)數(shù)A(j).Key,都可以通過分級(jí)函數(shù)計(jì)算,得出F(A(j).Key)=i;并且由分級(jí)函數(shù)F(A(j).Key)得知,i的值為1..m的正整數(shù),由此可以確定A(j).Key應(yīng)該劃分到等級(jí)B(i)之中。依次將每個(gè)數(shù)按關(guān)鍵字劃分到該去的級(jí)別后,待排序的n個(gè)數(shù)已根據(jù)關(guān)鍵字大小分為m個(gè)級(jí)別,即在MIN~MAX之間分為m個(gè)級(jí)別。
⑤分級(jí)中,比較有利的情況是,每個(gè)級(jí)別的B(i)中剛好放入一個(gè)數(shù),實(shí)際上可能不會(huì)這么湊巧,所以要完成分級(jí)還要解決以下問題1、某些級(jí)別要放入多個(gè)關(guān)鍵字怎么辦?2、某些級(jí)別沒有關(guān)鍵字(簡(jiǎn)稱為空級(jí)別)怎么辦?為此,特地在可分級(jí)變量B(i)中設(shè)計(jì)一個(gè)域?yàn)閿?shù)組C(k),存放B(i)中的多個(gè)變量,k作為該級(jí)別關(guān)鍵字的計(jì)數(shù)器。為了識(shí)別B(i).C(k)中的關(guān)鍵字和無效關(guān)鍵字,特地在每個(gè)級(jí)別的最后一個(gè)關(guān)鍵字后面設(shè)置一個(gè)結(jié)束字。例如在等級(jí)B(6)中,其初值B(6).(1)=MAX+1,當(dāng)放入一個(gè)關(guān)鍵字key1后,令B(6).C(1)=key1,k=k+1,B(6).C(k)=B(6).C(2)=MAX+1;同樣,再放入一個(gè)關(guān)鍵字key2后,令B(6).C(k)=B(6).C(2)=key2,k=k+1,B(6).C(k)=B(6).C(3)=MAX+1;于是關(guān)鍵字可分別放入B(6).C(1)、B(6).C(2)中,加上一個(gè)結(jié)束字B(6).C(3)=MAX+1,B(6)級(jí)別中共存放2個(gè)帶關(guān)鍵字的數(shù)據(jù)和一個(gè)結(jié)束字;另一種情況,經(jīng)分級(jí)函數(shù)計(jì)算后,某些級(jí)別中可能沒有關(guān)鍵字,那么這些級(jí)別的排序關(guān)鍵字還是等于賦初值時(shí)的情況,等于結(jié)束字,即令B(i).C(1)=MAX+1。
為了便于以后的查找工作,應(yīng)該保存分級(jí)排序時(shí)用到的分級(jí)函數(shù)F(A(j).Key)和可分級(jí)變量B(i)(k)這些信息,當(dāng)需要進(jìn)行查找時(shí),可以根據(jù)分級(jí)函數(shù)計(jì)算,得出F(A(j).Key)=i;直接確定要查找的關(guān)鍵字級(jí)別,提高查找速度。
這里以均勻分布函數(shù)為例分為m個(gè)級(jí)別,先算出關(guān)鍵字的MAX和MIN并做兩件事,1、令B(i).C(1)=MAX+1,(i=1…m),對(duì)所有級(jí)別賦初值;2、確定了關(guān)鍵字的范圍為MAX-MIN;按照均勻分布函數(shù)分級(jí),意思是將關(guān)鍵字范圍(MAX-MIN)劃分為m等份,按均布方式設(shè)計(jì)的分級(jí)函數(shù)為 F(A(j).Key)=1+int((m-1)*(A(j).Key-MIN)/(MAX-MIN))=i,則每取出一個(gè)數(shù)A(j).Key(j=1…n),可以通過分級(jí)函數(shù)計(jì)算出對(duì)應(yīng)的i,即確定了A(j).Key所對(duì)應(yīng)的B(i).C(k)的分級(jí)變量,確定A(j).Key所應(yīng)該在的等級(jí)為i,(i=1…m),于是令B(i).C(k)=A(j).Key,且k=k+1,B(i).C(k)=MAX+1。于是,A(1).Key…A(j).Key…A(n).Key就按照大小被劃分為m個(gè)等級(jí),實(shí)現(xiàn)了分級(jí)。
分級(jí)后,在同一個(gè)級(jí)別中的關(guān)鍵字可能是無序的,但是,在級(jí)與級(jí)之間是有序的,比如說一組升序排列的分級(jí)關(guān)鍵字,前級(jí)的任一關(guān)鍵字都會(huì)小于后級(jí)的任一關(guān)鍵字。
第二個(gè)過程是完全排序,有以下步驟①對(duì)所有存在多個(gè)關(guān)鍵字的級(jí)別,需要進(jìn)行級(jí)內(nèi)排序。如果關(guān)鍵字量不大,可以采用傳統(tǒng)方法(如冒泡排序和歸并排序)排序,如果關(guān)鍵字量大,可以再使用分級(jí)。
②關(guān)鍵字收集工作,設(shè)計(jì)一組數(shù)組變量D(1)…D(j)…D(n)用于關(guān)鍵字收集,搜索范圍是B(i).C(k-1),(i=1…m,k=1…&,&表示結(jié)束字所對(duì)應(yīng)的序號(hào)),對(duì)于每一級(jí)可分級(jí)變量B(i).C(k),遇到關(guān)鍵字就收集到D(j)中,遇到結(jié)束字就令i=i+1,跳轉(zhuǎn)到下一級(jí)進(jìn)行收集。因?yàn)槊總€(gè)級(jí)別都有結(jié)束字,所以在收集時(shí)避免了產(chǎn)生多余信息和漏掉信息;遍歷B(i).C(k-1),(i=1…m,k=1…&)后,A(1).Key…A(j).Key…A(n).Key就按照關(guān)鍵字大小存放于D(1)…D(j)…D(n)之中。
從以上分級(jí)排序方法可知,排序時(shí)間由三部分構(gòu)成,1、分級(jí)時(shí)間;2、級(jí)內(nèi)排序時(shí)間;3、關(guān)鍵字收集時(shí)間。
分級(jí)時(shí)間取決于待排序關(guān)鍵字的個(gè)數(shù)n和分級(jí)函數(shù)的復(fù)雜度,而與分級(jí)數(shù)m無關(guān),如果將待排序關(guān)鍵字的個(gè)數(shù)n和分級(jí)函數(shù)的復(fù)雜度固定,分級(jí)時(shí)間即固定,同時(shí)可知,均布分級(jí)函數(shù)復(fù)雜度最低,所用時(shí)間最少。
級(jí)內(nèi)排序時(shí)間,除排序方法外,取決于存在的多關(guān)鍵字級(jí)別個(gè)數(shù)和級(jí)內(nèi)多關(guān)鍵字個(gè)數(shù);也就是說,取決于分級(jí)數(shù)m,m越大則級(jí)內(nèi)排序時(shí)間越短。
關(guān)鍵字收集時(shí)間是與分級(jí)數(shù)目有關(guān),收集次數(shù)等于n加空級(jí)別數(shù)目,收集次數(shù)至少為n,所以m<n是不合理的,應(yīng)該取m值大于n。當(dāng)m>n時(shí),空級(jí)別數(shù)目不小于m-n,當(dāng)m>>n時(shí),空級(jí)別數(shù)目大致為m-n。分級(jí)數(shù)增加將引起空級(jí)別數(shù)增加,將引起關(guān)鍵字收集時(shí)間變長(zhǎng)。
綜合考慮三個(gè)時(shí)間因素,由于關(guān)鍵字收集的操作復(fù)雜度相對(duì)于分級(jí)和級(jí)內(nèi)排序的低得多,所以適量增加空級(jí)別可以較大地降低多關(guān)鍵字級(jí)別個(gè)數(shù)和級(jí)內(nèi)多關(guān)鍵字個(gè)數(shù),減少級(jí)內(nèi)排序時(shí)間,所以,選擇m=(2~5)*n是可取的。
結(jié)合實(shí)施例予以說明。
圖1是分級(jí)較少(6級(jí))時(shí)的分級(jí)。
圖2是分級(jí)較多(12)級(jí)時(shí)的分級(jí)。
圖3是分級(jí)排序的分級(jí)操作框圖。
圖4是分級(jí)排序的調(diào)用級(jí)內(nèi)排序程序和數(shù)據(jù)收集的框圖。
圖5是走路式歸并排序第一趟排序的框圖。
圖6是走路式歸并排序的走路式框圖。
以上附圖中采用了記錄數(shù)組變量進(jìn)行描述,代表了對(duì)可分級(jí)變量的描述。
1-待排序數(shù)據(jù)元素;2-分級(jí)變量;3-計(jì)數(shù)變量;4-定義待排序變量A(n)、分級(jí)變量B(m)、數(shù)據(jù)收集變量D(n),C(n),n為待排序數(shù)據(jù)元素個(gè)數(shù),m為分級(jí)數(shù);5-待排序關(guān)鍵字賦值到A(j)數(shù)組的key域中;6-求出最大值MAX和最小值MIN,預(yù)設(shè)B(i).C(k)準(zhǔn)備用于放置待排序關(guān)鍵字,并將B(i).C(1)賦初值(i=1..n;k=1),令其全部為結(jié)束字,比如MAX+1;7-分級(jí)所采用的循環(huán),對(duì)A(j).Key(i=1..n)進(jìn)行分級(jí);8-具體計(jì)算A(j).Key的級(jí)別;9-將級(jí)別賦值給i;10-將關(guān)鍵字賦值給可分級(jí)變量,并且使計(jì)數(shù)變量下跳一條。11-級(jí)內(nèi)排序和數(shù)據(jù)收集循環(huán);12-當(dāng)K>2時(shí),該級(jí)別內(nèi)不止一個(gè)關(guān)鍵字,還要進(jìn)行級(jí)內(nèi)排序,當(dāng)K<=2時(shí),該級(jí)別內(nèi)最多一個(gè)關(guān)鍵字,只要進(jìn)行數(shù)據(jù)收集。13-當(dāng)K=2時(shí),該級(jí)別內(nèi)確有一個(gè)關(guān)鍵字,要進(jìn)行數(shù)據(jù)收集,然后跳到下個(gè)級(jí)別;當(dāng)K<2時(shí),該級(jí)別內(nèi)沒有一個(gè)關(guān)鍵字,直接跳到下個(gè)級(jí)別。14-要進(jìn)行級(jí)內(nèi)排序。15-歸并排序時(shí),將分級(jí)排序中的級(jí)內(nèi)數(shù)據(jù)個(gè)數(shù)k-1作為歸并排序時(shí)的待排序個(gè)數(shù)n;16-設(shè)級(jí)別i中有n個(gè)待排序數(shù);17-第一趟排序循環(huán);18-關(guān)鍵字兩兩排序?yàn)閜序列,并將每個(gè)p序列以MAX+1作為結(jié)束字;19-如果被排序關(guān)鍵字為奇數(shù)個(gè),將最后一個(gè)另外處理;20-當(dāng)如果被排序關(guān)鍵字個(gè)數(shù)為大于1時(shí),進(jìn)行走路式歸并排序,不斷地進(jìn)行將p序列兩兩排序?yàn)閝序列,又將q序列兩兩排序?yàn)閜序列的循環(huán)運(yùn)算,直至最后為一個(gè)序列。21-將被排序?qū)ο髠€(gè)數(shù)t賦值給n;22-進(jìn)行一趟排序,將p序列兩兩排序?yàn)閝序列,并將每個(gè)q序列以MAX+1作為結(jié)束字;23-兩個(gè)序列都有關(guān)鍵字時(shí)的算法;24-比較大小和排序;25-26-只省一列有關(guān)鍵字時(shí)的算法;27-結(jié)果序列以結(jié)束字結(jié)束;28-如果被排序?qū)ο鬄槠鏀?shù)個(gè),將最后一個(gè)另外處理。29-將上一趟的序列個(gè)數(shù)作為這一趟的待排序序列個(gè)數(shù);30-進(jìn)行一趟排序,將q序列兩兩排序?yàn)閜序列,與22至29的過程相同,22進(jìn)行的排序是將p序列兩兩排序?yàn)閝序列,而30所進(jìn)行的是將q序列兩兩排序?yàn)閜序列。30后再回轉(zhuǎn)到20處,循環(huán)進(jìn)行將p序列兩兩排序?yàn)閝序列,將q序列兩兩排序?yàn)閜序列,直至最后為一個(gè)序列。
以下實(shí)施例以FOXPRO為編程工具,提供“分級(jí)程序”和“走路式歸并排序程序”,p(i,j)為可分級(jí)變量,a(i)為分級(jí)變量,b(i)為計(jì)數(shù)變量,c(i)為,d(i)*分級(jí)程序<pre listing-type="program-listing"><![CDATA[input″請(qǐng)輸入待排序元素個(gè)數(shù)和分級(jí)數(shù)″to ndime a(n),b(n,n),k(n),c(n),e(n)for t=1 n[input“請(qǐng)輸入待排序元素關(guān)鍵字”to a(t)e(t)=1+int((n-1)*(a(t)-MIN)/(MAX-MIN))]&&分級(jí)函數(shù)計(jì)算分級(jí)變量enddo*找出a(t)中的max和min (略)*給b(t,i)全賦值為max+1,k(t)賦初值1,(i=1..n,t=1..n)*t=1do while t<=ni=1do while i<=nb(t,i)=max+1i=i+1enddok(t)=1c(t)=MAX+1t=t+1enddoi=1do while i<=nif b(e(i),k(e(i))>maxb(e(i),k(e(i)))=a(i)elsek(e(i))=k(e(i))+1b(e(i),k(e(i)))=a(i)endifi=i+1.enddoi=1t=1do while i<=nj=1do while j<=nif b(i,j)<max+1c(t)=b(i,j)t=t+1endifj=j(luò)+1enddoi=i+1enddo*****走路式歸并排序input″請(qǐng)輸入待排序元素個(gè)數(shù)″to Ndime a(N),p(N,N),q(N,N)*兩兩排列t=1do while t<=int(N/2)if a(2*t-1)<=a(2*t)p(t,1)=a(2*t-1)p(t,2)=a(2*t)p(t,3)=max+1t=t+1eisep(t,1)=a(2*t)p(t,2)=a(2*t-1)p(t,3)=max+1t=t+1ENDIFt=t-1t=t+1enddoif int(N/2)<N/2p(t,1)=a(2*t-1)p(t,2)=max+1t=t+1endift=t-1do while t>1n=tt=1do while t<=int(N/2)store 1 to i,j,kdo while p(2*t-1,i)<(max+1).And.p(2*t,j)<(max+1)if p(2*t-1,i)<=p(2*t,j)q(t,k)=p(2*t-1,i)i=i+1elseq(t,k)=p(2*t,j)j=j(luò)+1endifk=k+1enddodo while p(2*t-1,i)<max+1q(t,k)=p(2*t-1,i)k=k+1i=i+1enddodo while p(2*t,j)<max+1q(t,k)=p(2*t,j)k=k+1j=j(luò)+1enddoq(t,k)=max+1t=t+1enddot=t-1store 1 to i,kif int(N/2)<N/2t=t+1do while p(2*t-1,i)<max+1q(t,k)=p(2*t-1,i)k=k+1i=i+1enddoq(t,k)=max+1endifn=tt=1do while t<=int(n/2)store 1 to i,j,kdo while q(2*t-1,i)<(max+1).And.q(2*t,j)<(max+1)if q(2*t-1,i)<=q(2*t,j)p(t,k)=q(2*t-1,i)i=i+1elsep(t,k)=q(2*t,j)j=j(luò)+1endifk=k+1do while q(2*t-1,i)<max+1p(t,k)=q(2*t-1,i)k=k+1i=i+1enddodo while q(2*t,j)<max+1p(t,k)=q(2*t,j)k=k+1j=j(luò)+1enddop(t,k)=max+1t=t+1enddot=t-1store 1 to i,kif int(N/2)<N/2t=t+1do while q(2*t-1,i)<max+1p(t,k)=q(2*t-1,i)k=k+1i=i+1enddop(t,k)=max+1endifenddo]]></pre>
權(quán)利要求
1.一種通過計(jì)算實(shí)現(xiàn)分級(jí)定位的排序和查找的方法,以下簡(jiǎn)稱為分級(jí)排序和查找,排序是將一組無序的關(guān)鍵字排列成有序的關(guān)鍵字,查找是在關(guān)鍵字已經(jīng)排序成有序的一組關(guān)鍵字中找到要找的某個(gè)關(guān)鍵字,本發(fā)明的特征是將排序分為兩個(gè)過程,首先完成分級(jí),然后進(jìn)行級(jí)內(nèi)排序和數(shù)據(jù)收集,完成完全排序預(yù)設(shè)定一組可以通過計(jì)算得到i和k而唯一確定的帶有數(shù)組B(i)的變量,作為存儲(chǔ)不同級(jí)別數(shù)據(jù)的單元,設(shè)有n個(gè)數(shù)A(1).Key…A(j).Key…A(n).Key待排序,每當(dāng)取出一個(gè)數(shù)A(j).Key,都可以通過分級(jí)函數(shù)計(jì)算,得出F(A(j).Key)=i;由此可以確定A(j).Key應(yīng)該劃分到等級(jí)B(i)之中;依次將每個(gè)數(shù)按關(guān)鍵字劃分到該去的級(jí)別后,待排序的n個(gè)數(shù)已根據(jù)關(guān)鍵字大小分為m個(gè)級(jí)別。
2.根據(jù)權(quán)利要求1所述的分級(jí)定位的排序和查找的方法,其進(jìn)一步的特征是設(shè)定一組可以通過計(jì)算得到i和k而唯一確定的變量,如數(shù)組類型的變量B(i,k)和層次記錄數(shù)組類型變量B(i),簡(jiǎn)稱為可分級(jí)變量,其中的下標(biāo)i用于表示級(jí)別大小,簡(jiǎn)稱為分級(jí)變量,如果希望將n個(gè)數(shù)A(1).Key…A(j).Key…A(n).Key的關(guān)鍵字key按大小分為m個(gè)等級(jí),那么就設(shè)定分級(jí)變量為m個(gè),即i=1…m;為敘述方便起見,以記錄數(shù)組類型變量B(i)展開說明;B(i)中的域C(k)是一個(gè)數(shù)組變量,是用于存放關(guān)鍵字的變量,其中的下標(biāo)k是用于統(tǒng)計(jì)放入i級(jí)變量B(i)中的關(guān)鍵字個(gè)數(shù)的計(jì)數(shù)器,稱為計(jì)數(shù)變量,(k=1…&,&表示結(jié)束字所對(duì)應(yīng)的序號(hào));將關(guān)鍵字分級(jí)的方法很多,可以按各種分布函數(shù)分級(jí),如正態(tài)分布函數(shù)、指數(shù)分布函數(shù)、t分布函數(shù)、F分布函數(shù)、x2分布函數(shù)、泊松分布函數(shù)、均勻分布函數(shù);
3.根據(jù)權(quán)利要求1所述的分級(jí)定位的排序和查找的方法,其進(jìn)一步的特征是計(jì)算出待排序關(guān)鍵字中的p個(gè)最大關(guān)鍵字keyMAX、MAX1、MAX2…MAXp、和q個(gè)最小關(guān)鍵字keyMIN、MIN1、MIN2…MINq;計(jì)算出關(guān)鍵字的最大值和最小值后,包含在此范圍內(nèi)的字可視為關(guān)鍵字,設(shè)定一個(gè)在此范圍以外的字作為結(jié)束字END,比如MAX+1或MIN-1;首先用結(jié)束字對(duì)所有的可分級(jí)變量賦初值,令B(i).C(1)=MAX+1,(i=1…m)。
4.根據(jù)權(quán)利要求1所述的分級(jí)定位的排序和查找的方法,其進(jìn)一步的特征是根據(jù)最大關(guān)鍵字和最小關(guān)鍵字以及待排序個(gè)數(shù)n,設(shè)計(jì)出分級(jí)函數(shù)F(A(j).Key),分級(jí)函數(shù)為F(A(j).Key)=1+int((m-1)*G(A(j).Key)),其中G(A(j).Key)表示各種分布函數(shù);每當(dāng)取出一個(gè)數(shù)A(j).Key,都可以通過分級(jí)函數(shù)計(jì)算,得出F(A(j).Key)=i;并且由分布函數(shù)F(A(j).Key)得知,i的值為1..m的正整數(shù),由此可以確定A(j).Key應(yīng)該劃分到等級(jí)B(i)之中;依次將每個(gè)數(shù)按關(guān)鍵字劃分到該去的級(jí)別后,待排序的n個(gè)數(shù)已根據(jù)關(guān)鍵字大小分為m個(gè)級(jí)別,即在MIN~MAX之間分為m個(gè)級(jí)別;
5.根據(jù)權(quán)利要求1所述的分級(jí)定位的排序和查找的方法,其進(jìn)一步的特征是在可分級(jí)變量B(i)中設(shè)計(jì)一個(gè)域?yàn)閿?shù)組C(k)存放B(i)中的多個(gè)變量,k作為該級(jí)別關(guān)鍵字的計(jì)數(shù)器;為了識(shí)別B(i).C(k)中的關(guān)鍵字和無效關(guān)鍵字,特地在每個(gè)級(jí)別的最后一個(gè)關(guān)鍵字后面設(shè)置一個(gè)結(jié)束字;例如在等級(jí)B(6)中,其初值B(6).C(1)=MAX+1,當(dāng)放入一個(gè)關(guān)鍵字key1后,令B(6).C(1)= key1,k=k+1,B(6).C(的=B(6).C(2)=MAX+1;同樣,再放入一個(gè)關(guān)鍵字key2后,令B(6).C(k)=B(6).C(2)=key2,k=k+1,B(6).C(k)=B(6).C(3)=MAX+1;于是關(guān)鍵字可分別放入B(6).C(1)、B(6).C(2)中,加上一個(gè)結(jié)束字B(6).C(3)=MAX+1,B(6)級(jí)別中共存放2個(gè)帶關(guān)鍵字的數(shù)據(jù)和一個(gè)結(jié)束字;另一種情況,經(jīng)分級(jí)函數(shù)計(jì)算后,某些級(jí)別中可能沒有關(guān)鍵字,那么這些級(jí)別的排序關(guān)鍵字還是等于賦初值時(shí)的情況,等于結(jié)束字,即令B(i).C(1)=MAX+1;
6.根據(jù)權(quán)利要求1所述的分級(jí)定位的排序和查找的方法,其進(jìn)一步的特征是為了便于以后的查找工作,應(yīng)該保存分級(jí)排序時(shí)用到的分級(jí)函數(shù)F(A(j).Key)和可分級(jí)變量B(i)(k)這些信息,當(dāng)需要進(jìn)行查找時(shí),可以根據(jù)分級(jí)函數(shù)計(jì)算,得出F(A(j).Key)=i;直接確定要查找的關(guān)鍵字級(jí)別,提高查找速度。
7.根據(jù)權(quán)利要求1所述的分級(jí)定位的排序和查找的方法,其進(jìn)一步的特征是這里以均勻分布函數(shù)為例分為m個(gè)級(jí)別,先算出關(guān)鍵字的MAX和MIN并做兩件事,1、令B(i).C(1)=MAX+1,(i=1…m),對(duì)所有級(jí)別賦初值;2、確定了關(guān)鍵字的范圍為MAX-MIN;按照均勻分布函數(shù)分級(jí),意思是將關(guān)鍵字范圍(MAX-MIN)劃分為m等份,按均布方式設(shè)計(jì)的分級(jí)函數(shù)為F(A(j).Key)=1+int((m-1)*(A(j).Key-MIN)/(MAX-MIN))=i,則每取出一個(gè)數(shù)A(j).Key(j=1…n),可以通過分級(jí)函數(shù)計(jì)算出對(duì)應(yīng)的i,即確定了A(j).Key所對(duì)應(yīng)的B(i).C(k)的分級(jí)變量,確定A(j).Key所應(yīng)該在的等級(jí)為i,(i=1…m),于是令B(i).C(k)=A(j).Key,且k=k+1,B(i).C(k)=MAX+1;于是,A(1).Key…A(j).Key…A(n).Key就按照大小被劃分為m個(gè)等級(jí),實(shí)現(xiàn)了分級(jí);分級(jí)后,在同一個(gè)級(jí)別中的關(guān)鍵字可能是無序的,但是,在級(jí)與級(jí)之間是有序的,比如說一組升序排列的分級(jí)關(guān)鍵字,前級(jí)的任一關(guān)鍵字都會(huì)小于后級(jí)的任一關(guān)鍵字;
8.根據(jù)權(quán)利要求1所述的分級(jí)定位的排序和查找的方法,其進(jìn)一步的特征是第二個(gè)過程是完全排序,有以下步驟①對(duì)所有存在多個(gè)關(guān)鍵字的級(jí)別,需要進(jìn)行級(jí)內(nèi)排序;如果關(guān)鍵字量不大,可以采用傳統(tǒng)方法(如冒泡排序和歸并排序)排序,如果關(guān)鍵字量大,可以再使用分級(jí);②關(guān)鍵字收集工作,設(shè)計(jì)一組數(shù)組變量D(1)…D(j)…D(n)用于關(guān)鍵字收集,搜索范圍是B(i).C(k-1),(i=1…m,k=1…&,&表示結(jié)束字所對(duì)應(yīng)的序號(hào)),對(duì)于每一級(jí)可分級(jí)變量B(i).C(k),遇到k域關(guān)鍵字就收集到D(j)中,遇到k域結(jié)束字就令i=i+1,跳轉(zhuǎn)到下一級(jí)進(jìn)行收集;因?yàn)槊總€(gè)級(jí)別都有結(jié)束字,所以在收集時(shí)避免了產(chǎn)生多余信息和漏掉信息;遍歷B(i).C(k-1),(i=1…m,k=1…&)后,A(1).Key…A(j).Key…A(n).Key就按照關(guān)鍵字大小存放于D(1)…D(j)…D(n)之中。
9.根據(jù)權(quán)利要求1所述的分級(jí)定位的排序和查找的方法,其進(jìn)一步的特征是當(dāng)n>3時(shí)的級(jí)內(nèi)排序采用走路式歸并排序,①、進(jìn)行一趟排序,將序列兩兩排序,并將每個(gè)結(jié)果序列以MAX+1作為結(jié)束字;②、將每?jī)蓚€(gè)P序列排列成一個(gè)q序列,如果P序列為奇數(shù)個(gè),將最后一個(gè)另外處理;③、將每?jī)蓚€(gè)q序列排列成一個(gè)p序列,如果q序列為奇數(shù)個(gè),將最后一個(gè)另外處理;④、回到②處,從而不斷地進(jìn)行將P序列兩兩排序?yàn)镼序列,又將Q序列兩兩排序?yàn)镻序列的循環(huán)運(yùn)算,直至最后為一個(gè)序列。
全文摘要
一種通過計(jì)算實(shí)現(xiàn)分級(jí)定位的排序和查找的方法,將一組無序的關(guān)鍵字排列成有序的關(guān)鍵字,預(yù)設(shè)定一組可以通過計(jì)算得到i和k而唯一確定的帶有數(shù)組B(i)的變量,作為存儲(chǔ)不同級(jí)別數(shù)據(jù)的單元,設(shè)有n個(gè)數(shù)A(1).Key…A(j).Key…A(n).Key待排序,每當(dāng)取出一個(gè)數(shù)A(j).Key,都可以通過分級(jí)函數(shù)計(jì)算,得出F(A(j).Key)=i;由此可以確定A(j).Key應(yīng)該劃分到等級(jí)B(i)之中;依次將每個(gè)數(shù)按關(guān)鍵字劃分到該去的級(jí)別后,待排序的n個(gè)數(shù)已根據(jù)關(guān)鍵字大小分為m個(gè)級(jí)別。
文檔編號(hào)G06F12/00GK1369806SQ0110687
公開日2002年9月18日 申請(qǐng)日期2001年2月16日 優(yōu)先權(quán)日2001年2月16日
發(fā)明者陳啟星 申請(qǐng)人:陳啟星