• <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>
            小四的海市蜃樓
            Never surrender to complexity
            posts - 21,comments - 59,trackbacks - 0

            在程序設(shè)計(jì)實(shí)踐上看到這個(gè)簡(jiǎn)單的快速排序,用模板重新寫(xiě)了一遍,加深一下印象。平均算法復(fù)雜度為O(nlogn)。

            其中尋找支點(diǎn)元素pivot有多種方法,不同的方法會(huì)導(dǎo)致快速排序的不同性能。根據(jù)分治法平衡子問(wèn)題的思想,希望支點(diǎn)元素可以使p[m..n]盡量平均地分為兩部分,但實(shí)際上很難做到。下面給出幾種尋找pivot的方法。

            1.選擇p[m..n]的第一個(gè)元素p[m]的值作為pivot;
            2.選擇p[m..n]的最后一個(gè)元素p[n]的值作為pivot;
            3.選擇p[m..n]中間位置的元素p[k]的值作為pivot;
            4.選擇p[m..n]的某一個(gè)隨機(jī)位置上的值p[random(n-m)+m]的值作為pivot;
              按照第4種方法隨機(jī)選擇pivot的快速排序法又稱(chēng)隨機(jī)化版本的快速排序法,在實(shí)際應(yīng)用中該方法的性能也是最好的。本程序使用第4種方法。要求節(jié)點(diǎn)類(lèi)型支持比較運(yùn)算符。


            template<typename T>
            void quicksort(T* v, int n)
            {
                
            if (n<=1)
                    
            return;
                
            int last = 0;
                
            int pivot = rand()%n;
                swap(v, 
            0, pivot);
                
            for (int i = 1; i < n; i++)
                
            {
                    
            if (v[i]<v[0])
                        swap(v, 
            ++last, i);
                }

                swap(v, last, 
            0);
                quicksort(v, last);
                quicksort(v
            +last+1, n-last-1);
            }


            template
            <typename T>
            void swap(T* v, int i, int j)
            {
                T tmp 
            = v[i];
                v[i] 
            = v[j];
                v[j] 
            = tmp;    
            }


            隨手寫(xiě)一個(gè)不太好看的測(cè)試程序

            struct str
            {
                str(
            const char* a)
                
            {
                    assert(a);
                    v 
            = new char[strlen(a)+1];
                    strcpy(v, a);
                }

                str(
            const str& a)
                
            {
                    assert(a.v);
                    v 
            = new char[strlen(a.v)+1];
                    strcpy(v, a.v);
                }

                
            ~str()
                
            {
                    delete [] v;
                }

                
            void operator = (const str& a)
                
            {
                    
            if (this == &a)
                        
            return;
                    assert(a.v);
                    delete [] v;
                    v 
            = new char[strlen(a.v)+1];
                    strcpy(v, a.v);
                }

                
            bool operator == (const str& a) const
                
            {
                    
            return (strcmp(v, a.v)==0);
                }

                
            bool operator > (const str& a) const 
                
            {
                    
            return (strcmp(v, a.v)>0);
                }

                
            bool operator < (const str& a) const
                
            {
                    
            return (strcmp(v, a.v)<0);
                }

                
            char* v;
            }
            ;


            int main(int argc, char* argv[])
            {
                
            int* array = new int [10];
                
            for(int i = 0; i < 10; i++)
                    array[i] 
            = rand();
                quicksort(array, 
            10);
                
            for(i = 0; i < 10; i++)
                
            {
                    cout
            <<array[i]<<endl;
                }


                str s[] 
            = {"bd""e""ba""a"};
                quicksort(s, 
            4);
                
            for(i = 0; i < 4; i++)
                
            {
                    cout
            <<s[i].v<<endl;
                }

                
            return 0;
            }


            posted on 2007-12-29 14:31 小四 閱讀(405) 評(píng)論(0)  編輯 收藏 引用 所屬分類(lèi): 算法與數(shù)據(jù)結(jié)構(gòu)
            久久精品亚洲男人的天堂 | 久久婷婷五月综合97色一本一本 | 久久久免费观成人影院| 婷婷久久综合九色综合九七| 亚洲va久久久噜噜噜久久狠狠| 国内精品久久久久久99蜜桃 | 91精品国产高清久久久久久91| 久久夜色精品国产www| AV无码久久久久不卡蜜桃| 久久婷婷色综合一区二区| 激情伊人五月天久久综合| 无码任你躁久久久久久老妇| 久久国产成人精品麻豆| 奇米影视7777久久精品| 一级做a爰片久久毛片免费陪| 欧美亚洲国产精品久久蜜芽| 久久影院综合精品| 久久无码AV中文出轨人妻| 久久精品国产99久久丝袜| 国产成人久久激情91| 亚洲精品蜜桃久久久久久| 伊人久久精品影院| 欧美亚洲日本久久精品| 国产精品成人精品久久久| 久久精品国产一区| 国产婷婷成人久久Av免费高清| 99精品久久精品一区二区| 久久AV高潮AV无码AV| 国产69精品久久久久APP下载| 久久综合日本熟妇| 无码乱码观看精品久久| 久久精品中文字幕有码| 久久久久久久亚洲精品| 久久人人爽人爽人人爽av| 久久久噜噜噜久久| 人人狠狠综合久久亚洲| 青青热久久国产久精品| 亚洲国产视频久久| 99精品久久久久久久婷婷| 久久SE精品一区二区| 久久久无码一区二区三区|