• <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>

            隨感而發(fā)

            雜七雜八

            統(tǒng)計(jì)

            留言簿(13)

            閱讀排行榜

            評(píng)論排行榜

            尋找第i小元素

            今天學(xué)習(xí)了求第i小元素,被書上忽悠了一下,他硬說(shuō)是0(n)的復(fù)雜度,我怎么看怎么看就是快速排序的思路,只是省去一半的遞歸而已。我開(kāi)始還以為真的就0(n)呢,自己還想了好久用一個(gè)循環(huán)搞定之,結(jié)果后來(lái)發(fā)現(xiàn),o(n)是最理想情況了。哎。書上說(shuō)的有個(gè)中位數(shù)來(lái)得到o(n)的求第i小元素的方法,可以我愚笨,沒(méi)有看懂。我就不信他插入排序不算時(shí)間,然后遞歸一下求中衛(wèi)數(shù),能正確?反正我是沒(méi)有看懂,也不敢實(shí)現(xiàn)了。只實(shí)現(xiàn)了快速排序思路的方法,而且還發(fā)現(xiàn),我寫了N遍快速排序了,居然還出錯(cuò)!我也發(fā)現(xiàn)我以前的寫法也有錯(cuò)。哎,郁悶啊。繼續(xù)加油吧。。堅(jiān)持。。
            奉上源代碼:(沒(méi)有什么,就是快排)
            #include <stdio.h>
            #include 
            <stdlib.h>
            #include 
            <time.h>

            //隨機(jī)分隔,(就是快排的分割函數(shù))
            int RandomPartition(int nData[], int nBegin, int nEnd)
            {
                
            int i = nBegin + rand() % (nEnd - nBegin);

                
            int nX = nData[i];
                nData[i] 
            = nData[nBegin];
                nData[nBegin] 
            = nX;
                
            --nEnd;
                
            while(nBegin < nEnd)
                {
                    
            while(nData[nEnd] > nX)
                    {
                        
            --nEnd;
                    }
                    
            if (nBegin < nEnd)
                    {
                        nData[nBegin] 
            = nData[nEnd];
                        nData[nEnd] 
            = nX;
                        
            ++nBegin;
                    }

                    
            while (nData[nBegin] < nX)
                    {
                        
            ++nBegin;
                    }
                    
            if (nBegin < nEnd)
                    {
                        nData[nEnd] 
            = nData[nBegin];
                        
            --nEnd;
                    }
                }

                nData[nBegin] 
            = nX;
                
            return nBegin;
            }

            //遞歸調(diào)用得到第i小元素
            int RandomIzedRecursion(int nData[], int nBegin, int nEnd, int nPos)
            {
                
            if (nBegin >= nEnd - 1)        //如果nBegin,直接認(rèn)為找到了該值
                {
                    
            return nData[nBegin];
                }
                
            int i = RandomPartition(nData, nBegin, nEnd);    //分割兩部分
                if (i == nPos)    //如果剛好分割符號(hào)就是nPos,就找到了這個(gè)值。
                {
                    
            return nData[i];
                }

                
            if (i > nPos)        //i > nPos。這繼續(xù)遞歸nBegin - i的區(qū)域。
                {
                    
            return RandomIzedRecursion(nData, nBegin, i, nPos);
                }
                                    
            //否則遞歸 i + 1, nEnd區(qū)域,不過(guò)這時(shí)候nPos要相應(yīng)的改變?yōu)閚Pos - i - 1
                return RandomIzedRecursion(nData, i + 1, nEnd, nPos - i - 1);
                

            }

            //得到第i小元素
            int RandomIzedSelect(int nData[], int nLen, int nPos)
            {
                srand((size_t)time(NULL));
                
            return RandomIzedRecursion(nData, 0, nLen, nPos);
            }

            int main()
            {
                
            int nData[10= {8,2,5,9,3,6,4,7,1,6};    //測(cè)試
                int nTest;
                
            for (int i = 0; i < 10++i)
                {
                    nTest 
            = RandomIzedSelect(nData, 10, i);
                    printf(
            "%d ", nTest);
                }
                printf(
            "\n");

                
            for (int i = 0; i < 10++i)        //注意,這里是改變了原來(lái)的數(shù)據(jù)
                {
                    printf(
            "%d ", nData[i]);
                }
                printf(
            "\n");
                system(
            "pause");
                
            return 0;
            }


            posted on 2009-04-27 19:36 shongbee2 閱讀(841) 評(píng)論(0)  編輯 收藏 引用 所屬分類: 數(shù)據(jù)結(jié)構(gòu)和算法

            久久久亚洲欧洲日产国码是AV| 亚洲中文字幕久久精品无码APP| 久久精品国产99国产电影网 | 亚洲乱亚洲乱淫久久| 国产亚洲色婷婷久久99精品91| 久久久久青草线蕉综合超碰| 国产精品久久久久无码av| 久久天天日天天操综合伊人av| 亚洲av成人无码久久精品| 精品久久久久久无码中文字幕 | 无码久久精品国产亚洲Av影片| 久久AⅤ人妻少妇嫩草影院| 久久人妻无码中文字幕| 草草久久久无码国产专区| 久久超碰97人人做人人爱| 一级做a爰片久久毛片免费陪| 国产Av激情久久无码天堂| 久久精品国产亚洲AV影院| 久久久久亚洲?V成人无码| 天天久久狠狠色综合| 无码国产69精品久久久久网站| 久久伊人色| 午夜肉伦伦影院久久精品免费看国产一区二区三区 | 精品久久久久久久久免费影院| 久久精品无码一区二区三区| 久久一日本道色综合久久| 欧美日韩久久中文字幕| 亚洲乱码日产精品a级毛片久久| 国产午夜电影久久| 色综合久久精品中文字幕首页| 韩国免费A级毛片久久| 久久久精品人妻一区二区三区四| 久久香综合精品久久伊人| 2021久久精品免费观看| 精品久久久无码21p发布| 久久精品亚洲AV久久久无码| 久久精品国产99国产精品导航| 少妇人妻88久久中文字幕| 久久久久久久久久久久中文字幕 | 亚洲国产另类久久久精品| 麻豆一区二区99久久久久|