專利名稱:基于位的排序方法和裝置的制作方法
技術(shù)領(lǐng)域:
本發(fā)明涉及排序方法及裝置。
背景技術(shù):
排序是一種基本且常用的算法。所謂排序,通常是指對文件中的記錄進行整理,使之按關(guān)鍵字遞增(或遞減)的次序排列。排序?qū)ο?,即文件,由一組記錄組成。每個記錄由若干個數(shù)據(jù)項(或域)組成,其中有一個數(shù)據(jù)項可用來標識記錄,稱為關(guān)鍵字項。用來作為排序運算依據(jù)的關(guān)鍵字項可以是數(shù)字類型,也可以是字符類型,其選取應根據(jù)具體情況而定,其值稱為關(guān)鍵字。
隨著計算機的發(fā)展,排序算法層出不窮。常用的有,例如,起泡排序、直接插入排序、簡單選擇排序、快速排序和堆排序等經(jīng)典排序算法。大多數(shù)排序算法都涉及兩個基本操作比較關(guān)鍵字的大?。缓?,改變指向記錄的指針或移動記錄本身,其中后者的實現(xiàn)依賴于待排序記錄的存儲方式。大多數(shù)排序算法的時間開銷主要來源于關(guān)鍵字之間的比較和記錄的移動。對于有些排序算法,其執(zhí)行時間不僅取決于問題的規(guī)模,還取決于實例中數(shù)據(jù)的狀態(tài)。因此,在實際進行排序時,應根據(jù)具體情況選擇合適的排序算法。
衡量算法性能的一個主要標準是時間復雜度,一般用0方法表示。例如,起泡排序的平均時間復雜度為0(n2),快速排序的平均時間復雜度為0(nlgn)。
發(fā)明內(nèi)容
本發(fā)明提出了一種基于位的排序方法和裝置。
根據(jù)本發(fā)明的第一方面,提供了對一組互不相同的整數(shù)排序的方法,包括估計整數(shù)的最大值和最小值;提供一個位數(shù)不小于最大值與最小值之差的連續(xù)存儲空間,將所述連續(xù)存儲空間的所有位置為第一值,所述連續(xù)存儲空間具有起始位;選擇一個不小于最小值且不大于最大值的整數(shù)作為參考值;
對于所述一組整數(shù)中的每個整數(shù),將所述連續(xù)存儲空間中、相對于所述起始位的增量位數(shù)等于該整數(shù)相對于所述參考值之增量的位置為第二值;以及,對于每個被置為第二值的位,確定該位相對于所述起始位的增量位數(shù)與所述參考值之和為所述一組整數(shù)中的一個整數(shù),確定該整數(shù)的排序位次為該位在所有被置為第二值的位中所處的位次。
優(yōu)選的是,所述參考值是最小值。
根據(jù)本發(fā)明的第二方面,提供了一種排序裝置,用于按照第一方面所述的方法對一組互不相同的整數(shù)排序。
根據(jù)本發(fā)明的第三方面,提供了對一組記錄排序的方法,所述一組記錄中的每個記錄具有能唯一識別該記錄、且為整數(shù)的關(guān)鍵字,該方法包括估計關(guān)鍵字的最大值和最小值;提供一個位數(shù)不小于最大值與最小值之差的連續(xù)存儲空間,將所述連續(xù)存儲空間的所有位置為第一值,所述連續(xù)存儲空間具有起始位;選擇一個不小于最小值且不大于最大值的整數(shù)作為參考值;對于所述一組記錄中的每個記錄的關(guān)鍵字,將所述連續(xù)存儲空間中、相對于所述起始位的增量位數(shù)等于該關(guān)鍵字相對于所述參考值之增量的位置為第二值,將該關(guān)鍵字所識別的記錄與該位對應;以及,對于每個被置為第二值的位,確定該位相對于所述起始位的增量位數(shù)與所述參考值之和為所述一組記錄中的一個記錄的關(guān)鍵字,確定該關(guān)鍵字的排序位次為該位在所有被置為第二值的位中所處的位次,將該關(guān)鍵字與對應于該位的記錄對應。
優(yōu)選的是,所述參考值是最小值。
根據(jù)本發(fā)明的第四方面,提供了一種對一組記錄排序的排序裝置,用于實現(xiàn)第三方面所述的方法。
本發(fā)明的主要優(yōu)點是時間復雜度僅為0(n)。附加優(yōu)點是,在某些情況下,可節(jié)省存儲空間。
附圖簡述僅以舉例的方式,參照附圖更詳細地描述本發(fā)明的優(yōu)選實施方案,其中
圖1示出了根據(jù)本發(fā)明的一個優(yōu)選實施方案的流程圖;圖2a-2g示出了利用圖1的流程圖對一個實例排序的過程;和圖3示意性圖解了根據(jù)本發(fā)明對記錄排序的過程。
具體實施例方式
首先通過一個具體例子來說明本發(fā)明的基本原則。
假設某班一共有15名學生,其中六名學生要補考英語,他們的學號分別為10、8、1、5、4、9,現(xiàn)在希望借助計算機根據(jù)他們學號的次序安排他們補考時的座位次序。為此,計算機要對這六名學生的學號進行排序。容易理解的是,待排序的學號均為整數(shù)、且互不相同。需要說明的是,該實例可能并未體現(xiàn)出本發(fā)明的一般應用,不過給出這個例子的目的僅在于清楚地描述本發(fā)明的基本原則。稍后將結(jié)合一般性的例子對本發(fā)明作進一步描述。
根據(jù)本發(fā)明的一個優(yōu)選實施方案,參照圖1所示的流程圖進行排序。首先,估計待排序整數(shù)的最大值Max和最小值Min。在這個例子中,根據(jù)該班共15名學生且學號一般會從1開始,可估計待排序整數(shù)的最大值為Max=15、最小值為Min=1。
然后,提供一個位數(shù)大于最大值與最小值之差的連續(xù)存儲空間,將所有位置“0”。在這個例子中,最大值與最小值之差為(Max-Min)=14。鑒于計算機中的存儲空間一般是以字節(jié)(Byte)為單位的,我們可確定一個16位(Bit)的連續(xù)存儲空間,如圖2a所示。
接下來,對于每個整數(shù),將連續(xù)存儲空間中、相對于起始位的增量位數(shù)等于該整數(shù)相對于最小值之增量的位置“1”。在這個例子中,對于第一個整數(shù)10,其相對于最小值Min的增量為10-1=9,于是將連續(xù)存儲空間中相對于起始位的增量位數(shù)等于9的位,即第(1+9)=10位,置“1”,如圖2b所示;對于第二個整數(shù)8,其相對于最小值的增量為8-1=7,于是將連續(xù)存儲空間中相對于起始位的增量位數(shù)等于7的位,即第(1+7)=8位,置“1”,如圖2c所示;依此類推,對于第三、四、五、六個整數(shù)1、5、4、9,分別將第(1+(1-Min))=1位、第(1+(5-Min))=5位、第(1+(4-Min))=4位、第(1+(9-Min))=9位置“1”,如圖2d-2g所示。
然后,從第一位開始遍歷連續(xù)存儲空間。若當前位為“1”,則將當前位相對于起始位的增量位數(shù)與最小值之和確定為所排序整數(shù)中的一個整數(shù),并將到目前為止遍歷到的“1”的個數(shù)確定為該整數(shù)的排序位次。就這個例子而言,第一位是“1”且是遍歷到的第一個“1”,第一位相對于起始位的增量位數(shù)是(1-1)=0,可確定排好序后的第一個整數(shù)相對于最小值的增量為0,即第一個整數(shù)為(Min+0)=1;第四位是“1”且是遍歷到的第二個“1”,第四位相對于起始位的增量位數(shù)是(4-1)=3,可確定排好序后的第二個整數(shù)相對于最小值的增量為3,即第二個整數(shù)為(Min+3)=4;類似地,第5位、第8位、第9位、第10位均為“1”,可確定排好序后的第三、四、五、六個整數(shù)分別相對于最小值的增量位數(shù)為(5-1)=4、(8-1)=7、(9-1)=8、(10-1)=9,即第三、四、五、六個整數(shù)分別為(Min+4)=5、(Min+7)=8、(Min+8)=9、(Min+9)=10。這樣,就得到了這6個整數(shù)即學號的排序結(jié)果1、4、5、8、9、10。
可替換地,在這一遍歷步驟中,可從連續(xù)存儲空間的最后一位進行遍歷,其它過程類似。容易理解的是,利用這種方式遍歷,將得到這6名學生的學號的遞減排序結(jié)果10、9、8、5、4、1。
實際上,針對所有排序整數(shù)進行上述置“1”操作后,連續(xù)存儲空間中存儲的位流和用作置“1”操作參考的最小值一起包含了有關(guān)所有排序整數(shù)的值及排序次序的信息,即已經(jīng)完成了排序。因此,根據(jù)具體情況,就排序而言,上述遍歷步驟可以不是必要的,而是可以在后來需利用排序結(jié)果時進行,例如在查詢、檢索等時進行。
需要說明的是,在這個優(yōu)選實施方案中,通過置“1”將待排序整數(shù)映射到所提供的連續(xù)存儲空間中的操作是相對所估計的最小值進行的,通常這也是優(yōu)選的。然而,就本發(fā)明的實質(zhì)而言,該操作也可相對除最小值以外的其它整數(shù)進行。當然,這個用作參考的整數(shù)應合適,至少應介于所估計的最小值與最大值之間,以便能將待排序整數(shù)映射到所提供的連續(xù)存儲空間的范圍內(nèi),即被確定要置“1”的位不超出連續(xù)存儲空間的范圍,從而避免空間不夠用。另外,對于所提供的連續(xù)存儲空間,最初可將所有位置“1”,之后進行映射操作時將有關(guān)位置“0”。
下面通過對記錄排序來對本發(fā)明進行描述。例如,一個學生管理系統(tǒng)的數(shù)據(jù)庫中有n條記錄,每條記錄有一個唯一的關(guān)鍵字,這個關(guān)鍵字一般是從1開始的。由于經(jīng)常對數(shù)鋸庫進行修改、刪除和添加,所以數(shù)據(jù)庫中的關(guān)鍵字一般并不是順序和連續(xù)的。但我們經(jīng)常要查詢某個關(guān)鍵字的記錄,我們通常會按照關(guān)鍵字對數(shù)據(jù)庫中的記錄進行排序,以便之后能以很快的速度進行查詢。
按照之前描述的方式,假如我們估計這個學校有1000名學生,則可推定關(guān)鍵字的最小值為Min=1,最大值Max=1000??砷_辟一塊包含至少1000個位的連續(xù)內(nèi)存,將該連續(xù)內(nèi)存全部置“0”。然后針對各個待排序記錄的關(guān)鍵字將有關(guān)位置“1”。這樣處理后得到的部分連續(xù)內(nèi)存如圖3的上部所示。
注意到,由于排序?qū)ο笫怯涗?,對關(guān)鍵字進行排序時,還應對關(guān)鍵字所對應的記錄進行適當?shù)牟僮?,以記錄它們之間的對應關(guān)系。在根據(jù)本發(fā)明的一種優(yōu)選實施方案中,為實現(xiàn)這一點,可開辟另一塊連續(xù)內(nèi)存(為方便敘述,在下文中將該另一塊連續(xù)內(nèi)存稱為第二連續(xù)內(nèi)存,將前面提到的連續(xù)內(nèi)存稱為第一連續(xù)內(nèi)存),用于存放記錄的地址,并將第一和第二連續(xù)內(nèi)存對應起來。目前,記錄的地址一般是32位的。鑒于此,使第二連續(xù)內(nèi)存的每32位依次與第一連續(xù)內(nèi)存中的1個位對應第二連續(xù)內(nèi)存中的第一個32位與第一連續(xù)內(nèi)存中的第一位對應;第二連續(xù)內(nèi)存中的第二個32位與第一連續(xù)內(nèi)存中的第二位對應;…;第二連續(xù)內(nèi)存中的最后一個32位與第一連續(xù)內(nèi)存中的最后一位對應。在開辟第二連續(xù)內(nèi)存時,通過使第二連續(xù)內(nèi)存的位數(shù)是第一連續(xù)內(nèi)存的位數(shù)的32倍,即可實現(xiàn)兩塊連續(xù)內(nèi)存之間的這種對應。
現(xiàn)在詳細說明如何保持關(guān)鍵字與相應記錄之間的對應關(guān)系。當將第一連續(xù)內(nèi)存中的第m位置“1”時,將該置“1”操作所針對的特定關(guān)鍵字所對應的記錄的地址存放在第二連續(xù)內(nèi)存中的第m個32位中。例如,當將圖3上部所示的第一連續(xù)內(nèi)存中的第4個位置“1”時,將該置“1”操作所針對的關(guān)鍵字所對應的記錄的地址存放在圖3下部所示的第二連續(xù)內(nèi)存中的第4個32位中。需要說明的是,圖3中的箭頭是示意性的,僅表示第一連續(xù)內(nèi)存與第二連續(xù)內(nèi)存之間存在對應關(guān)系。針對所有關(guān)鍵字進行上述置“1”操作后,從起始位開始遍歷第一連續(xù)內(nèi)存,可還原出各個記錄的關(guān)鍵字。具體過程參考上文。需要附加說明的操作是,當基于第一連續(xù)內(nèi)存中的某個被置為“1”的位還原出一個關(guān)鍵字時,還應根據(jù)第二連續(xù)內(nèi)存中的、與該被置為“1”的位對應的一個32位中存放的地址,將該地址所指向的記錄與所還原的關(guān)鍵字對應起來。這樣,還原所有關(guān)鍵字并將各個關(guān)鍵字與相應的記錄對應起來之后,可釋放第一和第二連續(xù)內(nèi)存。
可替換地,可將開辟的第二連續(xù)內(nèi)存用來直接存儲記錄的內(nèi)容。
基于本發(fā)明的原則,還可設想許多其他應用。下面給出一個例子。目前,在計算機中,整數(shù)一般需要用32位表示。假設要存儲一組互不相同的整數(shù),而該組整數(shù)的平均間隔較小,例如,小于32。在這種情況下,可利用本發(fā)明以位流的形式存儲這組整數(shù)。具體而言,以上文描述的方式,將待存儲的各個整數(shù)依次映射到一連續(xù)存儲空間中,得到一個位流,并記錄作為該映射操作參考的參考值。這樣位流和參考值就共同包含了有關(guān)這些整數(shù)的信息。以這種方式存儲的好處是能節(jié)省存儲空間。
盡管描述了本發(fā)明的優(yōu)選實施方案,但通過閱讀和掌握本發(fā)明的原則和教導,本領(lǐng)域的技術(shù)人員可對這里公開的實施方案進行各種改型。因而,本發(fā)明的范圍由附在這里的權(quán)利要求限定。
權(quán)利要求
1.對一組互不相同的整數(shù)排序的方法,包括估計整數(shù)的最大值和最小值;提供一個位數(shù)不小于最大值與最小值之差的連續(xù)存儲空間,將所述連續(xù)存儲空間的所有位置為第一值,所述連續(xù)存儲空間具有起始位;選擇一個不小于最小值且不大于最大值的整數(shù)作為參考值;對于所述一組整數(shù)中的每個整數(shù),將所述連續(xù)存儲空間中、相對于所述起始位的增量位數(shù)等于該整數(shù)相對于所述參考值之增量的位置為第二值;以及,對于每個被置為第二值的位,確定該位相對于所述起始位的增量位數(shù)與所述參考值之和為所述一組整數(shù)中的一個整數(shù),確定該整數(shù)的排序位次為該位在所有被置為第二值的位中所處的位次。
2.根據(jù)權(quán)利要求1所述的方法,其特征在于,所述參考值是最小值。
3.一種排序裝置,用于對一組互不相同的整數(shù)排序,該裝置包括估計整數(shù)的最大值和最小值的裝置;提供一個位數(shù)不小于最大值與最小值之差的連續(xù)存儲空間并將所述連續(xù)存儲空間的所有位置為第一值的裝置,所述連續(xù)存儲空間具有起始位;選擇一個不小于最小值且不大于最大值的整數(shù)作為參考值的裝置;映射裝置,對于所述一組整數(shù)中的每個整數(shù),將所述連續(xù)存儲空間中、相對于所述起始位的增量位數(shù)等于該整數(shù)相對于所述參考值之增量的位置為第二值;以及,還原裝置,對于每個被置為第二值的位,確定該位相對于所述起始位的增量位數(shù)與所述參考值之和為所述一組整數(shù)中的一個整數(shù),確定該整數(shù)的排序位次為該位在所有被置為第二值的位中所處的位次。
4.根據(jù)權(quán)利要求3所述的裝置,其特征在于,所述參考值是最小值。
5.對一組記錄排序的方法,所述一組記錄中的每個記錄具有能唯一識別該記錄、且為整數(shù)的關(guān)鍵字,該方法包括估計關(guān)鍵字的最大值和最小值;提供一個位數(shù)不小于最大值與最小值之差的連續(xù)存儲空間,將所述連續(xù)存儲空間的所有位置為第一值,所述連續(xù)存儲空間具有起始位;選擇一個不小于最小值且不大于最大值的整數(shù)作為參考值;對于所述一組記錄中的每個記錄的關(guān)鍵字,將所述連續(xù)存儲空間中、相對于所述起始位的增量位數(shù)等于該關(guān)鍵字相對于所述參考值之增量的位置為第二值,將該關(guān)鍵字所識別的記錄與該位對應;以及,對于每個被置為第二值的位,確定該位相對于所述起始位的增量位數(shù)與所述參考值之和為所述一組記錄中的一個記錄的關(guān)鍵字,確定該關(guān)鍵字的排序位次為該位在所有被置為第二值的位中所處的位次,將該關(guān)鍵字與對應于該位的記錄對應。
6.根據(jù)權(quán)利要求5所述的方法,其特征在于,所述參考值是最小值。
7.一種排序裝置,用于對一組記錄排序,所述一組記錄中的每個記錄具有能唯一識別該記錄、且為整數(shù)的關(guān)鍵字,該裝置包括估計關(guān)鍵字的最大值和最小值的裝置;提供一個位數(shù)不小于最大值與最小值之差的連續(xù)存儲空間并將所述連續(xù)存儲空間的所有位置為第一值的裝置,所述連續(xù)存儲空間具有起始位;選擇一個不小于最小值且不大于最大值的整數(shù)作為參考值的裝置;映射裝置,對于所述一組記錄中的每個記錄的關(guān)鍵字,將所述連續(xù)存儲空間中、相對于所述起始位的增量位數(shù)等于該關(guān)鍵字相對于所述參考值之增量的位置為第二值,將該關(guān)鍵字所識別的記錄與該位對應;以及,還原裝置,對于每個被置為第二值的位,確定該位相對于所述起始位的增量位數(shù)與所述參考值之和為所述一組記錄中的一個記錄的關(guān)鍵字,確定該關(guān)鍵字的排序位次為該位在所有被置為第二值的位中所處的位次,將該關(guān)鍵字與對應于該位的記錄對應。
8.根據(jù)權(quán)利要求7所述的裝置,其特征在于,所述參考值是最小值。
全文摘要
對一組互不相同的整數(shù)排序的方法,包括估計整數(shù)的最大值和最小值;提供一個位數(shù)不小于最大值與最小值之差的連續(xù)存儲空間,將所述連續(xù)存儲空間的所有位置為第一值,所述連續(xù)存儲空間具有起始位;選擇一個不小于最小值且不大于最大值的整數(shù)作為參考值;對于所述一組整數(shù)中的每個整數(shù),將所述連續(xù)存儲空間中、相對于所述起始位的增量位數(shù)等于該整數(shù)相對于所述參考值之增量的位置為第二值;以及,對于每個被置為第二值的位,確定該位相對于所述起始位的增量位數(shù)與所述參考值之和為所述一組整數(shù)中的一個整數(shù),確定該整數(shù)的排序位次為該位在所有被置為第二值的位中所處的位次。并提供基于關(guān)鍵字對記錄排序的方法。主要優(yōu)點是復雜度僅為0(n)。
文檔編號G06F17/30GK1790337SQ200510132879
公開日2006年6月21日 申請日期2005年12月27日 優(yōu)先權(quán)日2005年12月27日
發(fā)明者艾國 申請人:北京中星微電子有限公司