青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

聚星亭

吾笨笨且懶散兮 急須改之而奮進(jìn)
posts - 74, comments - 166, trackbacks - 0, articles - 0
  C++博客 :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理
[聲明] 本文引用與:GameRes 游戲開發(fā)網(wǎng)

一.引言

 

         前一段在http://www.allaboutprogram.com/上看到有關(guān)于排序方法的時(shí)間復(fù)雜度的研究,說的是在一般情況下,最好的時(shí)間復(fù)雜度是 O( n*LOG(n) ), 而在特定的情況下,比如要排序的數(shù)據(jù)是整數(shù),而且比較集中,也可以簡(jiǎn)化為 O(n)。

         后來我也給abp寫了封信,說明了一下對(duì)于一般的整數(shù)(int 或者unsigned int),也可以進(jìn)行復(fù)雜度為 O(n)的排序。我后來給了他一個(gè)我寫的STL的版本,實(shí)現(xiàn)了復(fù)雜度為O(n)的int排序。但實(shí)測(cè)起來,至少在n = 1000*1024的時(shí)候,還是比STL的sort 要慢。

         應(yīng)abp的要求,我寫了這篇文章,作為復(fù)雜度為O(n)的這種排序 ---- Radix Sort的介紹。今天,我在網(wǎng)上找到一小段代碼,和我寫的幾乎一樣,不過沒有用STL,實(shí)測(cè)性能在n =1024*1000的時(shí)候,VC 6 上 release 模式,排序時(shí)間:(tick)

 

n                         Radix Sort          STL Sort 
100*1024                 20                      20 
1000*1024              250                    320 
4000*1024              991                  1513 
10000*1024           2093                 3606

 

         圖一是一張曲線圖,可見Radix Sort 的確可能比STL Sort 快,而且,因?yàn)镽adix Sort時(shí)間復(fù)雜度小,在更長的時(shí)間內(nèi)表現(xiàn)更為充分。這一點(diǎn),在曲線圖里看得很清楚。n 從100* 1024增長到10000*1024, 排序時(shí)間也從20 增長到2093, 可以看出的確是O(n)的。


下面介紹一下Radix Sort 的算法。

二. Radix Sort 的簡(jiǎn)單算法

         考慮一種簡(jiǎn)單情況,如果你給一些unsigned char 排序,除了教科書上的很多方法外,還有一種簡(jiǎn)單的。可以這樣考慮。試想排一系列的unsigned char, 值從0~ 255 , 放在 u_char data_array[ARRAY_SIZE] 中,分配一個(gè)數(shù)組 u_char membuffer[255];

 

for(int i=0;i<255;i++
    membuffer[i]
=0
for(int i=0;i<ARRAY_SIZE;i++
    membuffer[data_array[i]]
++


         這樣,就把數(shù)字填到了membuffer內(nèi)部,然后,比如這個(gè)是輸出的數(shù)組

 

u_char sorted_array[ARRAY_SIZE]; 

int k=0

for(int i=0;i<255;i++
    
for(int j=0;j<membuffer[i]; j++
        sorted_array[k
++]=i;


         圖例:在256個(gè)entry的數(shù)組中,可能產(chǎn)生一系列的重復(fù)值。如下:

         每個(gè)entry中實(shí)際并不記錄值,而是記錄重復(fù)的次數(shù)。

1   3 4 5   7    
1      4 
       
4

 


         這樣,就把n = ARRAY_SIZE 的unsigned char 進(jìn)行了排序。

三.擴(kuò)展到int 的排序

         那么,如何擴(kuò)展到對(duì)于一般的整數(shù)進(jìn)行排序呢?可以這樣考慮。一個(gè) int,是由?。磦€(gè) char 組成(在32-bit int的系統(tǒng)上)在 Little Endian 字節(jié)順序( Least Siginficant Byte first , 比如 80x86架構(gòu)?。┫拢?<- low memory address                       high memory address ->
char 0    char 1    char 2    char 3

如果是 0x12345678 那么

char 0 就是 0x78
char 1 就是 0x56
char 2 就是 0x34
char 3 就是 0x12

         如果我們用最低位字節(jié)?。╟har 0)來作為 sort key對(duì)int 排序,然后使用次低做sort key, 然后用次高,最后用最高字節(jié)排序,實(shí)際的結(jié)果就是對(duì)整個(gè)int 進(jìn)行了排序。

         下面的a, b, c, d指int 的不同char, 讓我們進(jìn)行一下升序排序(ascending sort)

 

abcd 
bacd 
dcba 
caba 
bbac 

 

首先用最低位字節(jié)排序:

 

dcba 
caba 
bbac 
abcd 
bacd 

 

然后用次低位:

 

bbac 
dcba 
caba 
abcd 
bacd 

 

使用次高位:

 

caba 
bacd 
bbac 
abcd 
dcba 

 

然后使用最高位字節(jié)排序:

abcd

bacd 
bbac 
caba 
dcba 

 

于是經(jīng)過四次排序,就得到了一個(gè)升序的int排序。

為了方便理解, 給出一個(gè)排int 的實(shí)際算法 ,這是我寫的STL版本的Radix Sort ,可以 排任意多int,實(shí)際內(nèi)存占用并不太多。(沒有用2^32 的可怕的內(nèi)存量)

 

using namespace std; 

typedef vector 
<int>  HASH; 
typedef unsigned 
char  u_char; 

HASH  hashtable[
256];  //256 entries hash table 

const int array_size=1024*4000

void SortInt( int * data,  int size); 

void SortIntByChar(int * data,  int size, int pos); 

inline u_char GetHashvalue( 
int  value, int pos) 

    
return ((u_char*)&value)[pos]; 


void SortIntByChar(int * data,  int size, int pos) 

    
int i; 

    
//clear hashtable 
    for(i=0;i<256++i) 
    { 
        hashtable[i].clear(); 
    } 

    
//add into hash table 
    for(i=0;i< size; ++i) 
    { 
        hashtable[GetHashvalue(data[i],  pos)].push_back(data[i]); 
    } 

    
//output int 
    int k=0

    
if(pos!=3
    { 
        
for(i=0;i< 256++i) 
        { 
            
for(int j=0;j< hashtable[i].size(); ++j) 
            { 
                data[k
++]=hashtable[i][j]; 
            } 
        } 
    } 
    
else  //most significant byte 
    { 
        
for(i=128;i< 256++i) 
        { 
            
for(int j=0;j< hashtable[i].size(); ++j) 
            { 
                data[k
++]=hashtable[i][j]; 
            } 
        } 
        
for(i=0;i< 128++i) 
        { 
            
for(int j=0;j< hashtable[i].size(); ++j) 
            { 
                data[k
++]=hashtable[i][j]; 
            } 
        } 
    } 


void SortInt( int * data,  int size) 

    SortIntByChar(data, size, 
0); 
    SortIntByChar(data, size, 
1); 
    SortIntByChar(data, size, 
2); 
    SortIntByChar(data, size, 
3); 



         這里的方法,和前面說的最簡(jiǎn)單的并沒有太大不同,不同的是,因?yàn)閕nt是無法裝入char的數(shù)組的,所以,使用了一個(gè)vector<int> ,為256個(gè)entry中的任何一個(gè)。這樣,就把int的值裝入了。

         經(jīng)過測(cè)試,這個(gè)效果并不太好,對(duì)于n=1000*1024下為500 ticks ,比 STL Sort 的 320 ticks要慢。那么,前面的250 ticks 如何得來的呢?這就是有關(guān)優(yōu)化的問題。使用了STL,所以慢。因?yàn)樵?clear() 和push_back()中,作了過多你在這里不關(guān)心的事情。這里給出上面測(cè)試用的快速版本,未使用STL

 

void radix (int bytelong N, const long *source, long *dest) 

    
long count[256]; 
    
long index[256]; 

    memset (count, 
0sizeof (count)); 

    
for ( int i=0; i<N; ++i ) ++count[((source[i])>>(byte*8))&0xff]; 

    
if(byte!=3
    { 
        index[
0]=0
        
for ( i=1; i<256++i ) index[i]=index[i-1]+count[i-1]; 
    } 
    
else 
    { 
        index[
128]=0

        
for ( i=128+1; i<256++i )  index[i]=index[i-1]+count[i-1]; 

        index[
0]=index[255]+count[255]; 

        
for ( i=1; i<128++i ) index[i]=index[i-1]+count[i-1]; 
    } 

    
for ( i=0; i<N; ++i ) dest[index[((source[i])>>(byte*8))&0xff]++= source[i]; 


void radixsort (long *source, long *temp, long N) 

    radix (
0, N, source, temp); 
    radix (
1, N, temp, source); 
    radix (
2, N, source, temp); 
    radix (
3, N, temp, source); 


 

         不同的是,他多用了一個(gè)index數(shù)組來記錄每一個(gè)entry的開始的對(duì)應(yīng)于全體數(shù)據(jù)的index. 這樣,就不必使用STL 的vector。

這個(gè)版本的作者是Nils Pipenbrinck aka ,是我從網(wǎng)上找到的,本來是排unsigned long的,被我改成了 signed long 。

四.擴(kuò)展到float 的排序

         圖二是IEEE 754 規(guī)范中單精度 float的格式:即VC 中的float。

         在這里只討論float,不討論double。最高位(bit 31) 是符號(hào)位,如果為1,則表示為負(fù),為0則為非負(fù)。Exp 有8位,是表示指數(shù)部分的,Significand 是小數(shù)部分。在把十進(jìn)制表示的浮點(diǎn)數(shù)生成IEEE754各部分的時(shí)候,還有一些normalize 等操作,比較麻煩。因?yàn)檫@里主要討論排序,所以不仔細(xì)說了。

但有幾點(diǎn)可以這樣看:

         負(fù)數(shù)小于正數(shù),正數(shù)的絕對(duì)值越大值越大,負(fù)數(shù)相反。對(duì)于正數(shù),指數(shù)大的肯定大。相同的指數(shù),尾數(shù)大的更大。這樣,也可以強(qiáng)行比較字節(jié),從低字節(jié)開始比??墒堑谌齻€(gè)字節(jié)的最高位(bit23)有1位實(shí)際上是exp的最低位。

         可以這樣想,假設(shè) A 和B 是兩個(gè)正的float,A. bit 23代表A的第23位,那么:

 

Title         

if ( A . bit 23 > B. bit 23 ) , then A >B 成立

if(A.bit 23< B. bit 23) , then A<B 成立。

 

         那么,把指數(shù)的最低位放到和尾數(shù)一起組成的字節(jié)比較仍然可以比出浮點(diǎn)數(shù)的大小來。最后一次比較,最高字節(jié)的最高位是符號(hào)位。這可以特別處理。所以,比較浮點(diǎn)數(shù)和比較int 并沒有太大的不同,就是有些符號(hào)處理的問題要注意。

Pierre Terdiman 給出了排序float的算法。測(cè)試結(jié)果和STL排序float比較一下,如下:

 

N                       Radix Sort (float)         STL Sort (float
100*1024                30                                  30 
1000*1024             641                                431 
4000*1024            2334                             1903 
10000*1024          5788                             5498

 

(圖三)

         可以看出,至少在n=10000*1024的范圍里,Pierre Terdiman 的Radix Sort 方法還是比 STL sort 要慢。但我測(cè)了一下Pierre Terdiman 的int 排序,也是比STL sort慢。推測(cè)可能是他的算法優(yōu)化不夠。從道理上講,的確是O(n) 的復(fù)雜度,就是N 不是充分大的時(shí)候體現(xiàn)不出來。

         我曾看過在一個(gè)Nvidia 的工具的source code,據(jù)稱是最好的float 排序,但現(xiàn)在不在手邊。等我找到了也加上來。不同的source code的算法倒是基本上一樣,就是優(yōu)化的程度不同。但小小的優(yōu)化帶來的結(jié)果也可能是顯著的。

五.源代碼和參考資料 
         列出我寫的整數(shù)排序方法, 
         Nils Pipenbrinck aka 的整數(shù)排序方法, 
         和 Pierre Terdiman的整數(shù)和浮點(diǎn)排序方法。 
         “Radix Sort Tutorial” by Nils:http://www.allaboutprogram.com/RadixSortRevisited.mht

         “Radix Sort Revisited” by Pierre Terdiman:http://www.allaboutprogram.com/RadixSortTutorial.mht

Feedback

# re: [轉(zhuǎn)載]Radix Sort 的介紹 --------- 復(fù)雜度為O(n)的排序方法 [未登錄]  回復(fù)  更多評(píng)論   

2011-03-15 23:51 by a
Quick sort之所以快,是因?yàn)樗浅V甤ache-friendly,遠(yuǎn)比radix sort好得多……

只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            久久久噜噜噜久久狠狠50岁| 亚洲午夜在线视频| 国产精品无码永久免费888| 蜜臀久久99精品久久久画质超高清 | 国产精品视频成人| 欧美激情区在线播放| 久热精品视频在线观看| 欧美一区二区三区播放老司机| 日韩午夜剧场| 亚洲啪啪91| 久久综合久久综合九色| 久久电影一区| 欧美一级专区免费大片| 亚洲一区国产一区| 中文亚洲视频在线| 一区二区三区日韩精品视频| 亚洲精品日本| 亚洲精品无人区| 亚洲激情电影中文字幕| 在线成人激情| 影音先锋在线一区| 亚洲第一综合天堂另类专| 韩国精品一区二区三区| 国产日韩在线一区| 国产一区二区视频在线观看| 国产一区二区三区直播精品电影 | 久久艳片www.17c.com| 欧美在线亚洲在线| 久久国产一二区| 久久精品主播| 久久米奇亚洲| 欧美+日本+国产+在线a∨观看| 美女999久久久精品视频| 开心色5月久久精品| 蜜桃av一区| 欧美黄色小视频| 亚洲国产欧洲综合997久久| 亚洲国产mv| 亚洲精品永久免费| 日韩亚洲一区二区| 亚洲一区二区三区在线| 香蕉久久夜色精品| 久久久欧美精品| 老司机午夜精品视频| 欧美国产日韩一区| 欧美日韩一区免费| 国产精品久久久久久久久搜平片| 国产精品视频免费| 国内精品伊人久久久久av影院| 精品91在线| 亚洲久色影视| 亚洲欧美综合v| 久久九九久精品国产免费直播 | 亚洲男人的天堂在线观看| 亚洲欧美综合一区| 久久字幕精品一区| 欧美日韩成人在线| 国产日韩欧美在线观看| 在线观看欧美亚洲| 一二三四社区欧美黄| 欧美一区二区三区免费观看视频| 久久人体大胆视频| 91久久精品国产| 亚洲欧美日韩在线一区| 久久中文在线| 国产精品卡一卡二| 亚洲电影观看| 午夜精品免费在线| 欧美成人资源| 中文国产成人精品久久一| 久久精品日产第一区二区三区| 欧美大片va欧美在线播放| 国产精品一区三区| 亚洲精品视频在线观看网站| 午夜宅男欧美| 亚洲福利国产| 性亚洲最疯狂xxxx高清| 欧美精品在欧美一区二区少妇| 国产日韩av一区二区| 日韩视频亚洲视频| 久久人人97超碰国产公开结果 | 国产麻豆精品theporn| 亚洲日本在线视频观看| 欧美一级播放| 91久久精品日日躁夜夜躁欧美| 亚洲欧美日韩在线| 欧美日韩福利| 在线观看一区欧美| 欧美在线精品免播放器视频| 亚洲人成久久| 久久色中文字幕| 国产欧美一区二区色老头| 一本色道久久综合亚洲二区三区| 久久躁狠狠躁夜夜爽| 亚洲视频狠狠| 欧美日韩成人网| 亚洲欧洲另类国产综合| 久久久久久久久久久久久9999| 一卡二卡3卡四卡高清精品视频| 久久五月激情| 黄色国产精品一区二区三区| 午夜精彩国产免费不卡不顿大片| 91久久国产综合久久| 久久久亚洲成人| 国产一区视频网站| 欧美一区二区性| 一区二区精品| 欧美日韩一区二区三区在线| 亚洲久久一区二区| 欧美国产精品人人做人人爱| 久久精品国产清高在天天线| 国产性色一区二区| 午夜日韩电影| 亚洲一区二区视频在线观看| 欧美午夜一区二区| 亚洲视频在线免费观看| 亚洲精品一区在线观看香蕉| 欧美高清在线精品一区| 亚洲高清在线观看| 免费日韩av| 久热综合在线亚洲精品| 在线观看日韩av先锋影音电影院| 久久综合伊人77777麻豆| 久久国产精品第一页| 狠狠色噜噜狠狠色综合久 | 欧美激情按摩在线| 91久久国产综合久久蜜月精品| 免费成人激情视频| 久久裸体视频| 亚洲激情在线激情| 亚洲国产网站| 欧美日韩免费观看一区二区三区| 一区二区三区国产在线| 99亚洲视频| 国产精品久久网| 欧美在线视频一区| 久久精品国产在热久久| 亚洲高清视频一区| 亚洲欧洲日韩女同| 欧美视频一区二区三区| 午夜精品久久久久久久久| 午夜精品视频在线| 伊人婷婷欧美激情| 亚洲欧洲日韩在线| 国产精品久久久久久久久久妞妞| 性欧美xxxx视频在线观看| 欧美制服丝袜第一页| 亚洲国产美女久久久久| 亚洲精品日本| 国产欧美日韩亚州综合| 欧美本精品男人aⅴ天堂| 欧美激情免费观看| 小辣椒精品导航| 久久蜜桃av一区精品变态类天堂| 亚洲精品一区二区三区婷婷月| 99精品欧美一区二区三区 | 亚洲天堂免费观看| 先锋影音国产精品| 91久久夜色精品国产网站| 一本久道久久久| 狠狠v欧美v日韩v亚洲ⅴ| 亚洲国产毛片完整版| 国产精品成人在线观看| 久久综合给合久久狠狠狠97色69| 欧美国产精品人人做人人爱| 亚洲欧美日韩成人高清在线一区| 久久国产66| 一区二区三区不卡视频在线观看| 小嫩嫩精品导航| 亚洲美女精品一区| 午夜久久tv| 日韩系列在线| 欧美在线一区二区| 一区二区三区毛片| 久久精品30| 亚洲一区激情| 蜜月aⅴ免费一区二区三区| 亚洲专区一区| 蜜桃精品久久久久久久免费影院| 亚洲男人的天堂在线| 久久五月天婷婷| 羞羞视频在线观看欧美| 欧美电影资源| 久热精品视频| 国产精品一区在线播放| 91久久精品国产91久久| 好吊日精品视频| 亚洲一区二区三区成人在线视频精品| 亚洲国产成人在线| 亚洲欧美在线aaa| 亚洲深夜影院| 欧美福利一区二区| 免费观看在线综合色| 国产欧美va欧美不卡在线| 亚洲精品永久免费| 亚洲黄色尤物视频| 久久国产主播| 久久精品视频在线观看| 国产精品久久国产精品99gif| 91久久精品久久国产性色也91|