乙個快速排序的小技巧

2021-04-01 00:59:38 字數 1020 閱讀 7647

最近在設計的**中有這麼乙個要求,有一堆字串,如:

a[1], a[3], a[5], a[2]

(假設字首都是a,並且中括號中的數值沒有重複),現在要用程式將可以合併的陣列都合併起來,變成:

a[1..3], a[5]

那麼我想到的辦法是這樣的,將中括號中的數字提取出來,放在乙個list中,然後對list排序,也就是說上述資料排完序後變成:

1,2,3,5

那麼這時候再從頭至尾遍歷一下陣列就可以知道哪些數值是連續的了。

設計完後,coding工作交給了其他同事,為了快速實現**功能,他當時使用了氣泡排序,後來工作以忙,就再也沒有去改那些**,直到最近,使用者對該模組的效能提出了質疑(相比過去的版本,慢了很多),我們才回頭重新審視這段**,我自認為設計沒有什麼問題,只需要將氣泡排序改為快速排序就可以大幅度提高速度,正打算這麼做呢,pm前來了解了一下我們的工作,接著給出了乙個及其簡單而快速的排序方法:

由於我們要排序的數值都是唯一的,並且都是簡單的數字,所以以空間還速度的方法:先建立乙個足夠大的陣列,將其清零,當從list中每讀到乙個數值時,將將陣列的該位設為1,那麼按照上面的資料,最終我們的陣列就變為:

|  1  |  1  |  1  |  0  |  1  |  ......

這時候,再遍歷一下陣列,判斷0和1的狀態,就可以方便的知道哪些數值是連續的了。

另外,在事先從a[1]這樣的字串中提取出數值時,我們已經可以預先知道所有字元的數值,那麼確定了最小和最大值後,可以只分配這段剛好夠用的記憶體,而不需要開非常大的記憶體了。

其次,由於只需要用0,1兩種狀態表示陣列的某以位是否被佔據,那麼完全可以使用單個bit來表示狀態,那麼乙個byte,就可以用來表示前8個數值是否被佔據了,這樣又將記憶體節省到原來的1/8。

用了以上演算法後,不再需要任何排序工作了,使用quantify測試發現,該過程在整個模組的執行過程中的時間,由原來的30%變為2%了,非常了不起的演算法呢。(有時候真是**越簡單越有效啊,可惜我卻沒有想到,姜還是老的辣啊)。

圖克斯軟體:

乙個小技巧

下午去牙科看牙,順便幫我媽把鞋上個鞋絆。修鞋的老太太慈眉善目,於是跟她攀談起來。我問她,您看這鞋怎麼樣啊?老太太瞅瞅鞋,笑笑不說話。我又說,這是在沂蒙大樓專櫃買的,打折處理的 款,也不知道質量怎麼樣。老太太嗯嗯幾聲,還是不言語。一邊修著鞋,老太太看我態度還算虛心,就跟我傳授了經驗。大意就是,專櫃處理...

VIM ctags的乙個小技巧

vim可以使用ctags製作的tags檔案來瀏覽程式原始檔。問題是,當原始檔存放在目錄樹 也就是所謂的source tree 的時候,該怎麼辦呢?在預設情況下,ctags只會處理當前目錄裡的原始檔,而且vim也只會參考當前目錄的tags檔案。這時候,如果當前目錄裡的原始檔引用了其他目錄裡的定義,那麼...

tomcat的乙個小技巧

tomcat進入manage管理介面的方法.1,進入到tomcat檔案加然後進去找到conf資料夾裡面的tomcat user.xml檔案 2.用記事本開啟。3.要想進入到manage的管理頁面,首先新增乙個管理員角色 然後寫上你想要輸入的使用者名稱或者密碼即可 這樣就可以用從管理的manage裡面...