本發(fā)明涉及計(jì)算機(jī)技術(shù)領(lǐng)域,特別是涉及一種數(shù)據(jù)排序方法和裝置。
背景技術(shù):
目前存在多種排序算法,例如“冒泡排序”、“簡單選擇排序”、“直接插入排序”、“堆排序”、“希爾排序”等等,該些排序是在單片機(jī)芯片上面進(jìn)行排序的,通常在排序的時(shí)候會擦除原始信息,例如原始信息的存儲順序是A1、A2、A3、A4、A5時(shí),而排序后的信息是A2、A3、A1、A5、A4,由于排序是在單片機(jī)芯片的隨機(jī)存取存儲器中進(jìn)行的,因此會直接改變原始信息的存儲位置,從而得到排序后的信息,從而導(dǎo)致原始信息的存儲位置的丟失。
技術(shù)實(shí)現(xiàn)要素:
基于此,有必要提供一種數(shù)據(jù)排序方法和裝置,其可以在對數(shù)據(jù)排序后,仍可以保持原始數(shù)據(jù)信息。
一種數(shù)據(jù)排序方法,所述方法包括:
在每條待排序數(shù)據(jù)前添加指針;
通過修改所述指針對所述待排序數(shù)據(jù)進(jìn)行排序,在排序過程中保持所述待排序數(shù)據(jù)的存儲位置不變,使得每條排序后的數(shù)據(jù)的指針指向按照排序順序的下一條排序后的數(shù)據(jù)的地址。
在其中一個(gè)實(shí)施例中,所述在每條待排序數(shù)據(jù)前添加指針的步驟,是在每條待排序數(shù)據(jù)前添加指針以形成組合數(shù)據(jù)。
在其中一個(gè)實(shí)施例中,所述通過修改所述指針對所述待排序數(shù)據(jù)進(jìn)行排序的步驟中,是以關(guān)鍵字對所述待排序數(shù)據(jù)進(jìn)行排序;當(dāng)通過多組關(guān)鍵字分別進(jìn)行排序時(shí),所述在每條待排序數(shù)據(jù)前添加指針的步驟,是在每條待排序數(shù)據(jù)對應(yīng)的組合數(shù)據(jù)前添加與當(dāng)前排序依據(jù)的關(guān)鍵字對應(yīng)的指針以形成組合數(shù)據(jù)。
在其中一個(gè)實(shí)施例中,所述待排序數(shù)據(jù)為一數(shù)據(jù)塊,所述數(shù)據(jù)塊中包含數(shù)個(gè)字節(jié)的數(shù)據(jù)。
在其中一個(gè)實(shí)施例中,所述數(shù)據(jù)存儲于flash存儲器或ram存儲器中。
在其中一個(gè)實(shí)施例中,所述數(shù)據(jù)存儲于flash存儲器中;所述在每條待排序數(shù)據(jù)前添加指針的步驟中添加的指針的每一位均為1。
一種數(shù)據(jù)排序裝置,所述裝置包括:
數(shù)據(jù)模塊,用于存儲所述待排序數(shù)據(jù),且在排序過程中保持所述待排序數(shù)據(jù)的存儲位置不變。
指針模塊,該指針模塊的輸入端與所述數(shù)據(jù)模塊的輸出端相連接,該指針模塊用于在每條待排序數(shù)據(jù)前添加指針;
排序模塊,該排序模塊的輸入端與所述指針模塊的輸出端相連接,該排序模塊用于通過修改所述指針對所述待排序數(shù)據(jù)進(jìn)行排序,使得每條排序后的數(shù)據(jù)的指針指向按照排序順序的下一條排序后的數(shù)據(jù)的地址。
在其中一個(gè)實(shí)施例中,所述指針模塊包括:
關(guān)鍵字識別單元,用于獲取關(guān)鍵字的組數(shù);
指針添加單元,該指針添加單元的輸入端與所述關(guān)鍵字識別單元的輸出端相連接,該指針添加單元用于根據(jù)所述關(guān)鍵字的組數(shù),在每條待排序數(shù)據(jù)對應(yīng)的組合數(shù)據(jù)前添加與當(dāng)前排序依據(jù)的關(guān)鍵字對應(yīng)的指針以形成組合數(shù)據(jù)。
在其中一個(gè)實(shí)施例中,所述待排序數(shù)據(jù)為一數(shù)據(jù)塊,所述數(shù)據(jù)塊中包含數(shù)個(gè)字節(jié)的數(shù)據(jù)。
在其中一個(gè)實(shí)施例中,所述數(shù)據(jù)存儲于flash存儲器或ram存儲器中。
上述數(shù)據(jù)排序方法和裝置,通過引入指針,保持原始數(shù)據(jù)的存儲位置不變,僅僅通過改變指針來對數(shù)據(jù)進(jìn)行排序,使得每條排序后的數(shù)據(jù)的指針指向按照排序順序的下一條排序后的數(shù)據(jù)的地址,實(shí)現(xiàn)了非順序存儲的排序,排序效率高,應(yīng)用廣泛。
附圖說明
圖1為一實(shí)施例中數(shù)據(jù)排序方法的流程圖;
圖2為圖1所示實(shí)施例的一應(yīng)用圖;
圖3為圖2中所示的數(shù)據(jù)經(jīng)過排序后的示意圖;
圖4為圖1所示實(shí)施例的另一應(yīng)用圖;
圖5為一實(shí)施例中數(shù)據(jù)排序裝置的示意圖。
其中,
100 數(shù)據(jù)模塊
200 指針模塊
300 排序模塊
具體實(shí)施方式
為了使本發(fā)明的目的、技術(shù)方案及優(yōu)點(diǎn)更加清楚明白,以下結(jié)合附圖及實(shí)施例,對本發(fā)明進(jìn)行進(jìn)一步詳細(xì)說明。應(yīng)當(dāng)理解,此處所描述的具體實(shí)施例僅僅用于解釋本發(fā)明,并不用于限定本發(fā)明。
在詳細(xì)說明根據(jù)本發(fā)明的實(shí)施例前,應(yīng)該注意到的是,所述的實(shí)施例主要在于與數(shù)據(jù)排序方法和裝置相關(guān)的步驟和系統(tǒng)組件的組合。因此,所屬系統(tǒng)組件和方法步驟已經(jīng)在附圖中通過常規(guī)符號在適當(dāng)?shù)奈恢帽硎境鰜砹?,并且只示出了與理解本發(fā)明的實(shí)施例有關(guān)的細(xì)節(jié),以免因?qū)τ诘靡嬗诒景l(fā)明的本領(lǐng)域普通技術(shù)人員而言顯而易見的那些細(xì)節(jié)模糊了本發(fā)明的公開內(nèi)容。
在本文中,諸如左和右,上和下,前和后,第一和第二之類的關(guān)系術(shù)語僅僅用來區(qū)分一個(gè)實(shí)體或動作與另一個(gè)實(shí)體或動作,而不一定要求或暗示這種實(shí)體或動作之間的任何實(shí)際的這種關(guān)系或順序。術(shù)語“包括”、“包含”或任何其他變體旨在涵蓋非排他性的包含,由此使得包括一系列要素的過程、方法、物品或者設(shè)備不僅包含這些要素,而且還包含沒有明確列出的其他要素,或者為這種過程、方法、物品或者設(shè)備所固有的要素。
請參閱圖1所示,圖1為一實(shí)施例中數(shù)據(jù)排序方法的流程圖,在該實(shí)施例中,該方法可以包括:
S102:在每條待排序數(shù)據(jù)前添加指針。
請參閱圖2所示,圖2為圖1所示實(shí)施例的一應(yīng)用圖。在該實(shí)施例中,數(shù)據(jù)A1前添加第一指針1,數(shù)據(jù)A2前添加第一指針2,數(shù)據(jù)A3前添加第一指針3,數(shù)據(jù)A4前添加第一指針4,數(shù)據(jù)A5前添加第一指針5,且雖然在數(shù)據(jù)前添加了指針,但是該數(shù)據(jù)A1、A2、A3、A4、A5的存儲的先后順序并未改變。
S104:通過修改指針對待排序數(shù)據(jù)進(jìn)行排序,在排序過程中保持待排序數(shù)據(jù)的存儲位置不變,使得每條排序后的數(shù)據(jù)的指針指向按照排序順序的下一條排序后的數(shù)據(jù)的地址。
請參閱圖3所示,圖3為圖2中所示的數(shù)據(jù)經(jīng)過排序后的示意圖。在該實(shí)施例中,雖然經(jīng)過排序,但是數(shù)據(jù)A1、A2、A3、A4、A5的存儲的先后順序并未改變,即其的存儲位置是不變的,但是可以看到圖2中數(shù)據(jù)A1、A2、A3、A4、A5的指針發(fā)生了變化,假設(shè)排序后的數(shù)據(jù)的順序是A2、A5、A4、A3、A1,則可以發(fā)現(xiàn)數(shù)據(jù)A2前的第二指針指向了數(shù)據(jù)A5的地址,數(shù)據(jù)A5前的第五指針指向了數(shù)據(jù)A4的地址,數(shù)據(jù)A4前的第四指針指向了數(shù)據(jù)A3的地址,數(shù)據(jù)A3前的第三指針指向了數(shù)據(jù)A1的地址,即當(dāng)知曉了A2的地址,則就可以按照順序訪問A5、A4、A3、A1,在實(shí)際應(yīng)用中,數(shù)據(jù)可以依存儲順序進(jìn)行讀取,例如先讀取第一指針1,如果第一指針1未改變,則繼續(xù)讀取第一指針2,此時(shí)可以發(fā)現(xiàn)第一指針2指向了數(shù)據(jù)A5,這樣就可以按照順序訪問A5、A4、A3、A1,在其他實(shí)施例中,還可以在排序階段時(shí),在最小數(shù)據(jù)或最大數(shù)據(jù)或者以其他關(guān)鍵字進(jìn)行排序后的第一個(gè)數(shù)據(jù)的指針上進(jìn)行標(biāo)記,以標(biāo)識數(shù)據(jù)從該數(shù)據(jù)進(jìn)行讀取,這樣當(dāng)需要讀取時(shí),遍歷到該指針時(shí),則進(jìn)行數(shù)據(jù)的讀取。
因此在該實(shí)施例中,上述數(shù)據(jù)排序方法和裝置,通過引入指針,保持原始數(shù)據(jù)的存儲位置不變,僅僅通過改變指針來對數(shù)據(jù)進(jìn)行排序,使得每條排序后的數(shù)據(jù)的指針指向按照排序順序的下一條排序后的數(shù)據(jù)的地址,實(shí)現(xiàn)了非順序存儲的排序,排序效率高,應(yīng)用廣泛。
在其中一個(gè)實(shí)施例中,請?jiān)俅螀㈤唸D3所示,在每條待排序數(shù)據(jù)前添加指針的步驟具體可以為以在每條待排序數(shù)據(jù)前添加指針以形成組合數(shù)據(jù),例如圖3中所示的第一指針1和數(shù)據(jù)A1其組合形成為第一組合數(shù)據(jù),第一指針2和數(shù)據(jù)A2其組合也形成為第一組合數(shù)據(jù),第一指針3和數(shù)據(jù)A3其組合也形成為第一組合數(shù)據(jù),第一指針4和數(shù)據(jù)A4其組合也形成為第一組合數(shù)據(jù),第一指針5和數(shù)據(jù)A5其組合也形成為第一組合數(shù)據(jù)。
該種數(shù)據(jù)的形成可以應(yīng)用在僅以一個(gè)關(guān)鍵字進(jìn)行排序的場景中,例如在老師統(tǒng)計(jì)成績的時(shí)候,其可能需要僅以成績?yōu)殛P(guān)鍵字進(jìn)行排序,這時(shí)在每個(gè)數(shù)據(jù)前僅添加一個(gè)指針即可。在該實(shí)施例中,在需要進(jìn)行排序時(shí)通過改變指針?biāo)赶虻牡刂穪磉M(jìn)行數(shù)據(jù)的排序,即僅改變指針,但保持原始數(shù)據(jù)的順序。例如老師可能在統(tǒng)計(jì)數(shù)據(jù)時(shí),其可能是按照學(xué)號進(jìn)行輸入的,則原始數(shù)據(jù)是以學(xué)號為順序進(jìn)行的,而在排序時(shí),老師可能是以成績進(jìn)行排序的,則在排序時(shí),保留原始按照學(xué)號存儲的數(shù)據(jù)的存儲順序,僅通過改變指針來改變數(shù)據(jù)的排序,實(shí)現(xiàn)了非順序存儲的排序,這樣當(dāng)老師又需要以學(xué)號為順序的成績時(shí),則計(jì)算機(jī)內(nèi)部就不需要再一次對以成績排序的數(shù)據(jù)再次進(jìn)行排序,直接調(diào)用即可,防止系統(tǒng)因多次排序而造成的卡頓現(xiàn)象。
請參閱圖4所示,圖4為圖1所示實(shí)施例的另一應(yīng)用圖,在該實(shí)施例中,當(dāng)通過多組關(guān)鍵字分別進(jìn)行排序時(shí),在每條待排序數(shù)據(jù)前添加指針的步驟,是在每條待排序數(shù)據(jù)對應(yīng)的組合數(shù)據(jù)前添加與當(dāng)前排序依據(jù)的關(guān)鍵字對應(yīng)的指針以形成組合數(shù)據(jù)。在該實(shí)施例中,存在多個(gè)關(guān)鍵字,即存在以多個(gè)關(guān)鍵字分別進(jìn)行排序的排序后的數(shù)據(jù),傳統(tǒng)情況下如果需要存儲這種數(shù)據(jù),則需要將同樣的數(shù)據(jù)進(jìn)行多次存儲,例如當(dāng)存在3個(gè)關(guān)鍵字時(shí),則相應(yīng)的數(shù)據(jù)可能需要存儲3遍,或者每一次調(diào)用以不同關(guān)鍵字進(jìn)行排序的數(shù)據(jù)時(shí),都需要再次計(jì)算進(jìn)行排序,從而可能造成系統(tǒng)的卡頓。
請參閱圖4所示,在該實(shí)施例中,其包含3個(gè)關(guān)鍵字,在其他的實(shí)施例中,其還可以包括2個(gè)關(guān)鍵字、4個(gè)關(guān)鍵字、5個(gè)關(guān)鍵字、6個(gè)關(guān)鍵字、7個(gè)關(guān)鍵字、8個(gè)關(guān)鍵字、10個(gè)關(guān)鍵字、15個(gè)關(guān)鍵字等。
請繼續(xù)參閱圖4所示,其應(yīng)用場景為網(wǎng)頁(知網(wǎng)或者淘寶網(wǎng)網(wǎng)頁版等等)或app(例如,美團(tuán)、大眾點(diǎn)評等),本實(shí)施例中以淘寶網(wǎng)頁為例,假設(shè)第一關(guān)鍵字為銷售量,第二關(guān)鍵字為好評率,第三關(guān)鍵字為價(jià)格,以A1數(shù)據(jù)為例,A1數(shù)據(jù)加上第一指針1,其形成了第一組合數(shù)據(jù),其中第一指針1用以在數(shù)據(jù)以銷售量為關(guān)鍵字進(jìn)行排序后,指向下一條數(shù)據(jù);第一組合數(shù)據(jù)加上第二指針1,其形成了第二組合數(shù)據(jù),其中第二指針1用以在數(shù)據(jù)以好評率為關(guān)鍵字進(jìn)行排序后,指向下一條數(shù)據(jù);第二組合數(shù)據(jù)加上第三指針1,其形成了第三組合數(shù)據(jù),其中第三指針1用以在數(shù)據(jù)以價(jià)格為關(guān)鍵字進(jìn)行排序后,指向下一條數(shù)據(jù)。在該實(shí)施例中,通過改變指針,數(shù)據(jù)實(shí)際上被排序了三次,但是數(shù)據(jù)的存儲順序并未發(fā)生改變,且由于指針都保留并未被擦除,因此每一次的排序數(shù)據(jù)均被保留下來,且特別是在淘寶網(wǎng)頁這種應(yīng)用場景中,用戶在購物時(shí),可以在短時(shí)間內(nèi)需要以不同的關(guān)鍵字進(jìn)行排序,例如其可能需要首先以銷售量進(jìn)行排序,然后再以價(jià)格進(jìn)行排序,如果每一次的排序均需要重新進(jìn)行計(jì)算的話,則會占用較大的資源,極易造成系統(tǒng)的卡頓,降低用戶的體驗(yàn),而在上述實(shí)施例中,其不存在上述狀況,因?yàn)槊看我圆煌年P(guān)鍵字進(jìn)行排序時(shí),均會增加一指針,從而該指針可以保留排序信息,系統(tǒng)需要調(diào)用以不同的關(guān)鍵字進(jìn)行排序的數(shù)據(jù)時(shí),只需要調(diào)用相應(yīng)的指針即可,不需要再重新計(jì)算。
如果在一種應(yīng)用場景中,不需要重復(fù)調(diào)用以一個(gè)關(guān)鍵字的排序,可以每次排序時(shí),僅針對第一指針進(jìn)行更改,不需要再添加第二指針等,例如當(dāng)上述數(shù)據(jù)存儲在ram(random access memory,隨機(jī)存取存儲器)中時(shí),可以按照關(guān)鍵字的排序隨意更改指針。
在其中一個(gè)實(shí)施例中,待排序數(shù)據(jù)為一數(shù)據(jù)塊,數(shù)據(jù)塊中包含數(shù)個(gè)字節(jié)的數(shù)據(jù)。例如當(dāng)一條待排序數(shù)據(jù)為一個(gè)數(shù)據(jù)塊,該數(shù)據(jù)塊可以為一個(gè)結(jié)構(gòu)體,該結(jié)構(gòu)體中的包含姓名信息、性別信息、成績信息、班級信息,且假設(shè)上述信息均為整型數(shù)據(jù),即每個(gè)數(shù)據(jù)占據(jù)2個(gè)字節(jié),則每條待排序數(shù)據(jù)包含8個(gè)字節(jié)。在其他實(shí)施例中,每條待排序數(shù)據(jù)可以能占據(jù)的字節(jié)數(shù)不同,例如有的待排序數(shù)據(jù)可能占據(jù)16字節(jié),有的待排序數(shù)據(jù)可能占據(jù)64字節(jié),有的待排序數(shù)據(jù)可能占據(jù)4字節(jié)。在其他的實(shí)施例中,例如上述所示的淘寶網(wǎng)頁的實(shí)施例,待排序數(shù)據(jù)可能包含一個(gè)待售貨物的相關(guān)介紹數(shù)據(jù)、圖片數(shù)據(jù)等,其占據(jù)的字節(jié)數(shù)可能更多,或者例如知網(wǎng)或者soopat這種文章檢索網(wǎng)頁,其待排序數(shù)據(jù)可能包含一篇文章、作者等信息,其占據(jù)的字節(jié)數(shù)可能會更多。
在其中一個(gè)實(shí)施例中,數(shù)據(jù)存儲于flash存儲器(Flash存儲器,英文名稱是“Flash Memory”,一般簡稱為“Flash”)或ram存儲器(random access memory,隨機(jī)存取存儲器)中均可以,或者也可以存儲于其他形式的存儲器中。
單片機(jī)芯片上面的ram(random access memory,隨機(jī)存取存儲器)可以隨意改變。但是像是flash(Flash存儲器,英文名稱是“Flash Memory”,一般簡稱為“Flash”,它屬于內(nèi)存器件的一種)這樣的寫操作只能夠從“1”寫成“0”的存儲設(shè)備,如果需要進(jìn)數(shù)據(jù)從“0”寫成“1”,則需要連續(xù)擦除一片存儲空間,其不能夠單獨(dú)修改某一byte(字節(jié))。因此目前這種存儲器進(jìn)行數(shù)據(jù)排序時(shí),通常需要擦除一片存儲空間,例如原始數(shù)據(jù)的地址是00FF00FF時(shí),經(jīng)過排序后的數(shù)據(jù)的地址為FF00FF00,此時(shí)首先需要擦除存儲器中存儲的00FF00FF,將其修改成為FFFFFFFF,然后再將FFFFFFFF修改為FF00FF00,其操作過程麻煩,且需要擦除一片存儲區(qū)域,還改變了原始數(shù)據(jù)的地址,而在本實(shí)施例中,當(dāng)數(shù)據(jù)存儲于flash存儲器中時(shí),在每條待排序數(shù)據(jù)前添加指針的步驟中添加的指針的每一位均為1,這樣在排序過程中,將對應(yīng)指針進(jìn)行修改即可,且在該實(shí)施例中,如果以不同的關(guān)鍵字進(jìn)行排序,其可以在待排序數(shù)據(jù)前添加多個(gè)指針,分別對應(yīng)不同的關(guān)鍵字的排序,例如上述的實(shí)施例中所述。
請參閱圖5所示,圖5為一實(shí)施例中數(shù)據(jù)排序裝置的示意圖,在該實(shí)施例中,該裝置可以包括數(shù)據(jù)模塊100、指針模塊200和排序模塊300,該指針模塊200的輸入端與數(shù)據(jù)模塊100的輸出端相連接,該排序模塊300的輸入端與指針模塊200的輸出端相連接。
數(shù)據(jù)模塊100用于存儲待排序數(shù)據(jù),且在排序過程中保持待排序數(shù)據(jù)的存儲位置不變。該指針模塊200用于在每條待排序數(shù)據(jù)前添加指針。該排序模塊300用于通過修改指針對待排序數(shù)據(jù)進(jìn)行排序,使得每條排序后的數(shù)據(jù)的指針指向按照排序順序的下一條排序后的數(shù)據(jù)的地址。
在其中一個(gè)實(shí)施例中,該指針模塊200可以包括關(guān)鍵字識別單元和指針添加單元,該指針添加單元的輸入端與關(guān)鍵字識別單元的輸出端相連接;關(guān)鍵字識別單元用于獲取關(guān)鍵字的組數(shù);該指針添加單元用于根據(jù)關(guān)鍵字的組數(shù),在每條待排序數(shù)據(jù)對應(yīng)的組合數(shù)據(jù)前添加與當(dāng)前排序依據(jù)的關(guān)鍵字對應(yīng)的指針以形成組合數(shù)據(jù)。
在其中一個(gè)實(shí)施例中,待排序數(shù)據(jù)為一數(shù)據(jù)塊,數(shù)據(jù)塊中包含數(shù)個(gè)字節(jié)的數(shù)據(jù)。在其中一個(gè)實(shí)施例中,數(shù)據(jù)存儲于flash存儲器或ram存儲器中。在其中一個(gè)實(shí)施例中,當(dāng)數(shù)據(jù)存儲于flash存儲器中時(shí),在數(shù)據(jù)排序前,在每條待排序數(shù)據(jù)前添加的指針的每一位均為1。
對該裝置的具體限定可以參閱上文對方法的限定,在此不再贅述。
以上所述實(shí)施例的各技術(shù)特征可以進(jìn)行任意的組合,為使描述簡潔,未對上述實(shí)施例中的各個(gè)技術(shù)特征所有可能的組合都進(jìn)行描述,然而,只要這些技術(shù)特征的組合不存在矛盾,都應(yīng)當(dāng)認(rèn)為是本說明書記載的范圍。
以上所述實(shí)施例僅表達(dá)了本發(fā)明的幾種實(shí)施方式,其描述較為具體和詳細(xì),但并不能因此而理解為對發(fā)明專利范圍的限制。應(yīng)當(dāng)指出的是,對于本領(lǐng)域的普通技術(shù)人員來說,在不脫離本發(fā)明構(gòu)思的前提下,還可以做出若干變形和改進(jìn),這些都屬于本發(fā)明的保護(hù)范圍。因此,本發(fā)明專利的保護(hù)范圍應(yīng)以所附權(quán)利要求為準(zhǔn)。