• <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>
            posts - 12,  comments - 54,  trackbacks - 0
            寫了個(gè)nth_element的函數(shù),覺(jué)得比較pp,就貼上來(lái)了 -- 注意,跟庫(kù)函數(shù)那個(gè)有點(diǎn)差別

             1 void swap( int& a, int& b )
             2 {
             3   
             4     a ^= b;
             5     b ^= a;
             6     a ^= b;
             7 }
             8 
             9 int partation( int* arr, int low, int high )
            10 {
            11     int ans = low - 1;
            12     for ( int i = low; i < high; ++i )
            13     {
            14         if ( arr[i] < arr[high] )
            15         {
            16             swap( arr[i], arr[++ans] );
            17         }
            18     }
            19     swap( arr[++ans], arr[high] );
            20     return ans;
            21 }
            22 
            23 int nth( int* arr, int low, int high, int index )
            24 {
            25     int mid = partation(arr, low, high);
            26     if ( mid == index ) return arr[mid];
            27     return 
            28         ( mid < index )  ? 
            29         nth(arr, mid+1, high, index) :
            30         nth(arr, low, mid-1, index);
            31 }


            然后呢,在某人的新貼下發(fā)現(xiàn)這樣的評(píng)論:
            真要命,就怕碰見(jiàn)上來(lái)就貼一大堆代碼的。
            有比這還可怕的嗎?——有!貼一大堆代碼還沒(méi)注釋!


            不管了,反正只是覺(jué)得代碼漂亮,沒(méi)有想到要解釋什么
            一段測(cè)試代碼如下:

             1 #include <iostream>
             2 #include <iterator>
             3 #include <algorithm>
             4 #include <ctime>
             5 using namespace std;
             6 
             7 int main()
             8 {
             9     const int size = 99;
            10     int arr[size];
            11     for ( int index = 0; index < size; ++index )
            12         arr[index] = index;
            13 
            14     srand( time(0) );
            15 
            16     random_shuffle( arr, arr+size );
            17 
            18     copy( arr, arr+size, ostream_iterator<int>( cout, " " ) );
            19     cout << endl;
            20 
            21     cout << "the 73th element is " << nth( arr, 0, size-173 ) << endl;
            22 
            23     copy( arr, arr+size, ostream_iterator<int>( cout, " " ) );
            24     cout << endl;
            25 
            26     return 0;
            27 }
            28 

            由于當(dāng)序列有序程度很高時(shí)候, 這種算法效率比較差,最好在調(diào)用之前把目標(biāo)序列隨機(jī)打亂一下,也就是上式random_shuffle( arr, arr+size );的由來(lái)。

            P.S: 感謝xxgamexx
            posted on 2008-11-06 16:47 Wang Feng 閱讀(7079) 評(píng)論(32)  編輯 收藏 引用 所屬分類: Numerical C++

            FeedBack:
            # re: nth_element ---- 比較優(yōu)美的代碼[未登錄](méi)
            2008-11-06 17:38 | Kevin
            有點(diǎn)小意見(jiàn)
            個(gè)人不太喜歡得地方就加空格,例如:if ( a == b ) return;
            不過(guò)LZ在運(yùn)算符前后又省掉了空格,例如:arr+size

            比較喜歡這樣寫:
            if (a == b) a = a + b;

            每個(gè)人寫代碼的習(xí)慣不同,所以LZ別介意啊  回復(fù)  更多評(píng)論
              
            # re: nth_element ---- 比較優(yōu)美的代碼
            2008-11-06 17:50 | Wang Feng
            copy( arr, arr+size, ostream_iterator<int>( cout, " " ) );
            我覺(jué)得這樣寫,看起來(lái)容易一點(diǎn)
            因?yàn)槎禾?hào)運(yùn)算符優(yōu)先級(jí)最低,于是arr+size中的加號(hào)在逗號(hào)之前;
            我的習(xí)慣是先運(yùn)行的更緊密一些;
            如你比較喜歡的這個(gè)
            if (a == b) a = a + b;
            我會(huì)寫成
            if (a == b) a = a+b;
            或者
            if (a == b)
            {
            a = a+b;
            }
            或者
            if (a == b)
            ++a;
            或者
            if (a == b)
            {
            ++a;
            }
              回復(fù)  更多評(píng)論
              
            # re: nth_element ---- 比較優(yōu)美的代碼
            2008-11-06 18:10 | 空明流轉(zhuǎn)
            如果不需要處理異常,不需要用戶提示,不需要安全機(jī)制,不需要照顧性能,
            那么,
            所有的代碼都可以很優(yōu)美。  回復(fù)  更多評(píng)論
              
            # re: nth_element ---- 比較優(yōu)美的代碼
            2008-11-06 18:11 | fish_autumn
            效率有待提高  回復(fù)  更多評(píng)論
              
            # re: nth_element ---- 比較優(yōu)美的代碼
            2008-11-06 18:12 | Wang Feng
            @空明流轉(zhuǎn)
            @fish_autumn
            請(qǐng)求指點(diǎn)  回復(fù)  更多評(píng)論
              
            # re: nth_element ---- 比較優(yōu)美的代碼
            2008-11-06 20:05 | cdy20
            換位 很漂亮

            這樣就行了
            a^=b^=a^=b;  回復(fù)  更多評(píng)論
              
            # re: nth_element ---- 比較優(yōu)美的代碼
            2008-11-06 20:55 | Wang Feng
            @cdy20
            這樣寫的話,用g++編譯后交換失敗;
            用icpc編譯后交換成功,非常奇怪
            可有人給出更多測(cè)試?
            我的編譯器:
            $ g++ -v
            Using built-in specs.
            Target: x86_64-unknown-linux-gnu
            Configured with: ../configure --prefix=/usr --enable-shared --enable-languages=c,c++,fortran,objc,obj-c++,treelang --enable-threads=posix --mandir=/usr/share/man --infodir=/usr/share/info --enable-__cxa_atexit --disable-multilib --libdir=/usr/lib --libexecdir=/usr/lib --enable-clocale=gnu --disable-libstdcxx-pch --with-tune=generic
            Thread model: posix
            gcc version 4.3.2 (GCC)
            $ icpc -v
            Version 10.1
              回復(fù)  更多評(píng)論
              
            # re: nth_element ---- 比較優(yōu)美的代碼
            2008-11-07 10:50 | zuhd
            能說(shuō)說(shuō)這個(gè)函數(shù)的作用嗎?
            int partation( int* arr, int low, int high )
            沒(méi)看明白  回復(fù)  更多評(píng)論
              
            # re: nth_element ---- 比較優(yōu)美的代碼
            2008-11-07 13:50 | Wang Feng
            @zuhd
            你可以這樣理解:
            1) 找到一個(gè)arbitrary value A(這個(gè)數(shù)值應(yīng)該是任意的,我圖寫起來(lái)利落,直接指定為數(shù)組的最后一個(gè)元素----比較好的做法是,執(zhí)行之前,在數(shù)組中任意尋找一個(gè)元素與數(shù)組最后一個(gè)元素交換)
            2)一個(gè)指針指向數(shù)組的第一個(gè)元素,往向后掃描,找到第一個(gè)大于A的元素,標(biāo)記為arr[a];
            3)另外一個(gè)指針指向數(shù)組的最后一個(gè)元素,向前掃面,找到第一個(gè)小于A的元素arr[b];
            4)交換arr[a] arr[b]
            5)若兩個(gè)指針沒(méi)有重合,轉(zhuǎn)到2)
            6)將A與兩個(gè)指針重合地點(diǎn)的元素交換
            這樣以來(lái),以A為界,把數(shù)組分為兩個(gè)部分,前邊部分?jǐn)?shù)值都是不大于A的,后邊的部分的數(shù)值都是不小于A的  回復(fù)  更多評(píng)論
              
            # re: nth_element ---- 比較優(yōu)美的代碼
            2008-11-08 18:17 | 雷長(zhǎng)炎
            這就是堆排序的實(shí)現(xiàn)了,一趟排序而已。要完整實(shí)現(xiàn)堆排序,需要反復(fù)調(diào)用該函數(shù)了。  回復(fù)  更多評(píng)論
              
            # re: nth_element ---- 比較優(yōu)美的代碼[未登錄](méi)
            2008-11-09 20:58 | cepvoggg
            void swap( int& a, int& b )
            2 {
            3 if ( a == b ) return;
            4 a ^= b;
            5 b ^= a;
            6 a ^= b;
            7 }
            這個(gè)代碼是你自己寫的嗎,這個(gè)好像是錯(cuò)的噢
              回復(fù)  更多評(píng)論
              
            # re: nth_element ---- 比較優(yōu)美的代碼[未登錄](méi)
            2008-11-09 21:02 | cepvoggg
            在C語(yǔ)言編程專家里面有說(shuō)過(guò)這個(gè)代碼是錯(cuò)的  回復(fù)  更多評(píng)論
              
            # re: nth_element ---- 比較優(yōu)美的代碼[未登錄](méi)
            2008-11-09 21:31 | feng
            @cepvoggg
            是我自己寫的;
            敢問(wèn)錯(cuò)在哪里?
            我手里沒(méi)有C語(yǔ)言編程專家這本書,你說(shuō)的是不是C expert programming?  回復(fù)  更多評(píng)論
              
            # re: nth_element ---- 比較優(yōu)美的代碼
            2008-11-10 09:41 | zuhd
            9 int partation( int* arr, int low, int high )
            10 {
            11 int ans = low - 1;
            12 for ( int i = low; i < high; ++i )
            13 {
            14 if ( arr[i] < arr[high] )
            15 {
            16 swap( arr[i], arr[++ans] );
            17 }
            18 }
            19 swap( arr[++ans], arr[high] );
            20 return ans;
            21 }
            ==========================================
            覺(jué)得你上面這段代碼好奇怪啊,這個(gè)函數(shù)的目的是“找到第一個(gè)比最后一個(gè)數(shù)大的數(shù)"嗎?如果是這樣,我覺(jué)得沒(méi)有必要這么寫,我想功能可能不只是這些  回復(fù)  更多評(píng)論
              
            # re: nth_element ---- 比較優(yōu)美的代碼
            2008-11-10 13:11 | Wang Feng
            @zuhd
            不是,這段代碼目的是:以A為界,把數(shù)組分為兩個(gè)部分,前邊部分?jǐn)?shù)值都是不大于A的,后邊的部分的數(shù)值都是不小于A的  回復(fù)  更多評(píng)論
              
            # re: nth_element ---- 比較優(yōu)美的代碼
            2008-11-11 09:55 | zuhd
            @Wang Feng
            我有個(gè)疑問(wèn),就是如果僅滿足“以ans為界,把數(shù)組分為兩個(gè)部分,前邊部分?jǐn)?shù)值都是不大于arr[ans]的,后邊的部分的數(shù)值都是不小于arr[ans]的”,程序的運(yùn)行結(jié)果可以有很多種啊,你的給出的結(jié)果的依據(jù)是什么呢?  回復(fù)  更多評(píng)論
              
            # re: nth_element ---- 比較優(yōu)美的代碼
            2008-11-11 15:34 | 天策魂之音
            @cepvoggg
            請(qǐng)問(wèn)這個(gè)錯(cuò)在哪里?

            有沒(méi)考慮到的狀況還是?  回復(fù)  更多評(píng)論
              
            # re: nth_element ---- 比較優(yōu)美的代碼
            2008-11-11 15:38 | Wang Feng
            @zuhd
            "程序的運(yùn)行結(jié)果可以有很多種啊"里邊的程序是指 partation還是nth?  回復(fù)  更多評(píng)論
              
            # re: nth_element ---- 比較優(yōu)美的代碼
            2008-11-11 15:39 | Wang Feng
            @天策魂之音
            我用隨機(jī)數(shù)測(cè)試過(guò)42憶次,沒(méi)有出錯(cuò)過(guò);
            不知道錯(cuò)誤是什么  回復(fù)  更多評(píng)論
              
            # re: nth_element ---- 比較優(yōu)美的代碼
            2008-11-12 09:35 | zuhd
            @Wang Feng
            我說(shuō)的是partation這個(gè)函數(shù),如果要求程序輸出“以ans為界,把數(shù)組分為兩個(gè)部分,前邊部分?jǐn)?shù)值都是不大于arr[ans]的,后邊的部分的數(shù)值都是不小于arr[ans]的”,那么結(jié)果不是唯一的  回復(fù)  更多評(píng)論
              
            # re: nth_element ---- 比較優(yōu)美的代碼
            2008-11-12 21:22 | Wang Feng
            @zuhd
            如果arr已經(jīng)給定不可更改,那么這個(gè)結(jié)果就是唯一的  回復(fù)  更多評(píng)論
              
            # re: nth_element ---- 比較優(yōu)美的代碼
            2008-11-13 09:47 | zuhd
            比如:
            輸入:3,5,7,4,0,1
            我可以得到這樣的數(shù)組3,4,0,1,5,7返回4,即在第4個(gè)位子的‘5’把數(shù)組分為兩部分。同時(shí)我也可以返回3,0,1,4,5,7返回3,即在第3個(gè)位子的‘4’把數(shù)組分為這樣的兩部分。等等
            這樣的返回值都能滿足你的需求啊  回復(fù)  更多評(píng)論
              
            # re: nth_element ---- 比較優(yōu)美的代碼
            2008-11-13 14:56 | Wang Feng
            @zuhd
            3,5,7,4,0,1
            第一次調(diào)用partation(arr, 0, 5)是以1為界分的;
            結(jié)果數(shù)組被排成
            0 1 7 4 3 5
            返回1  回復(fù)  更多評(píng)論
              
            # re: nth_element ---- 比較優(yōu)美的代碼
            2008-11-14 13:05 | zwp
            人各有好,不打擊樓主對(duì)代碼形式的追求。
            但就從實(shí)際角度來(lái)說(shuō),好的設(shè)計(jì)就會(huì)帶來(lái)賞心悅目的代碼。  回復(fù)  更多評(píng)論
              
            # re: nth_element ---- 比較優(yōu)美的代碼
            2008-11-14 16:13 | 阿爾法
            樓主的最后一行代碼明顯錯(cuò)了:
            return
            28 ( mid < index ) ?
            29 nth(arr, mid+1, high, index) : 應(yīng)該index改為index-mid吧
            30 nth(arr, low, mid-1, index);
              回復(fù)  更多評(píng)論
              
            # re: nth_element ---- 比較優(yōu)美的代碼
            2009-01-07 01:23 | guest
            這樣遞歸的話,如果原數(shù)組有正序,不用很長(zhǎng),比如1萬(wàn),是會(huì)溢出的!  回復(fù)  更多評(píng)論
              
            # re: nth_element ---- 比較優(yōu)美的代碼
            2009-01-08 10:42 | Wang Feng
            @guest
            確實(shí)是這樣的,要解決的話也不是很困難,只要partation時(shí)候把數(shù)組random shuffle一下就可以了:)  回復(fù)  更多評(píng)論
              
            # re: nth_element ---- 比較優(yōu)美的代碼
            2009-08-15 12:58 | guest
            個(gè)人認(rèn)為partition跟快排中的partition實(shí)現(xiàn)同樣的功能,不過(guò)LZ這樣寫不容易讓人看明白。
            lZ的應(yīng)該是從最前面開(kāi)始找,找到一個(gè)比最后一個(gè)小的數(shù),則和從0位置開(kāi)始的數(shù)想交換,執(zhí)行一次后,ans前面是比它小的數(shù)后面是比它大的數(shù)。

            另外效率是在不敢恭維。尋找最大或最小比較次數(shù)太多。  回復(fù)  更多評(píng)論
              
            # re: nth_element ---- 比較優(yōu)美的代碼[未登錄](méi)
            2009-08-15 16:06 | feng
            @guest
            其實(shí)無(wú)論從前邊還是后邊開(kāi)始尋找,都是可以的
            不過(guò)重要的是尋找之前把數(shù)列打亂一下,以避免在碰到有序數(shù)列的時(shí)候時(shí)間復(fù)雜度飆升的尷尬。

            我覺(jué)得效率上沒(méi)有什么問(wèn)題了,絕對(duì)是 O(n)。   回復(fù)  更多評(píng)論
              
            # re: nth_element ---- 比較優(yōu)美的代碼
            2010-12-31 11:21 | pkuoliver
            @feng
            很明顯,時(shí)間復(fù)雜度不是O(N),最壞情況下時(shí)間復(fù)雜度是O(N^2),最好時(shí)間復(fù)雜度是O(N),平均時(shí)間復(fù)雜度是O(N*logN)。這是個(gè)典型的分治算法。  回復(fù)  更多評(píng)論
              
            # re: nth_element ---- 比較優(yōu)美的代碼[未登錄](méi)
            2011-04-21 22:58 | feng
            # re: nth_element ---- 比較優(yōu)美的代碼[未登錄](méi)
            2011-08-13 15:04 | xxx
            @雷長(zhǎng)炎
            是quicksort的一遍實(shí)現(xiàn),不是heapsort。  回復(fù)  更多評(píng)論
              

            <2011年4月>
            272829303112
            3456789
            10111213141516
            17181920212223
            24252627282930
            1234567

            常用鏈接

            留言簿(4)

            隨筆分類

            隨筆檔案

            Link List

            搜索

            •  

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            亚洲国产精品无码久久久久久曰 | 色综合久久综精品| 69国产成人综合久久精品| 国产精品一区二区久久精品涩爱| 色婷婷噜噜久久国产精品12p | 久久精品国产99国产精偷| 久久久久久久久久久久久久| 久久久久久av无码免费看大片| 亚洲国产成人乱码精品女人久久久不卡| 久久精品国产一区二区三区不卡| 青青热久久国产久精品| 久久精品不卡| 久久国产精品免费| 久久久WWW成人免费精品| 久久青青草原精品国产软件 | 无码伊人66久久大杳蕉网站谷歌| 浪潮AV色综合久久天堂| 亚洲AV无码久久寂寞少妇| 无码AV中文字幕久久专区| 精品人妻伦九区久久AAA片69| 久久婷婷五月综合色奶水99啪| 久久99精品久久久大学生| 99久久免费国产精品热| 久久无码精品一区二区三区| 亚洲国产成人精品久久久国产成人一区二区三区综 | 国产亚洲精久久久久久无码77777 国产亚洲精品久久久久秋霞 | 精品人妻久久久久久888| 久久精品国产网红主播| 日本道色综合久久影院| 国产激情久久久久久熟女老人| 久久国产精品久久国产精品| 94久久国产乱子伦精品免费 | 99久久国产亚洲综合精品| 午夜精品久久久久久99热| 国产国产成人精品久久| 很黄很污的网站久久mimi色| 久久福利资源国产精品999| 精品久久国产一区二区三区香蕉| 久久午夜伦鲁片免费无码| 久久亚洲欧美日本精品| 国产精品99久久免费观看|