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

            學習筆記

            C++、Linux

              C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
              0 隨筆 :: 1 文章 :: 0 評論 :: 0 Trackbacks

            導讀:http://www.cnblogs.com/zhjp11/archive/2010/02/26/1674227.html

             

            現在要選擇第k小的數字,一種比較簡單的方法就是先排序,然后根據下標找出第k小的數字,這個時間復雜度為O(nlogn)

            selectKth有點類似于快速排序,不過他的時間復雜度為O(n)。(就是導讀中的解法3)

            下面是一個運行時間的對比圖,selectKth的運行時間有很明顯的優勢。

             



             

            main.cpp
            #include <iostream>
            #include <cstdlib>
            #include <algorithm>
            #include "Record.h"
            #include "Rand.h"
            #include "SelectKth.h"
            using namespace std;
            const int MaxSize=1000000;
            const int Step=5000;
            int main()
            {
                Record record;
                int A[MaxSize],B[MaxSize],C[MaxSize];
                int curLen,i,kth;
                for(curLen=Step;curLen<MaxSize;curLen+=Step)
                {
                    for(i=0;i<curLen;i++)
                    {
                        A[i]=RandIn(0,1234567);
                        B[i]=A[i];
                        C[i]=A[i];
                    }
                    kth=RandIn(0,curLen)+1;
                    cout<<curLen<<"\t";
                    //sort
                    record.StartRecord();
                    sort(B,B+curLen);
                    cout<<B[kth-1]<<"\t";
                    record.PrintCostTime();
                    //select kth
                    record.StartRecord();
                    cout<<"\t"<<SelectKth(C,0,curLen-1,kth)<<"\t";
                    record.PrintCostTime();
                    cout<<endl;
                }
                return 0;
            }

            Record.h
            #ifndef RECORD__HH
            #define RECORD__HH
            #include<iostream>
            #include<ctime>
            #include<fstream>
            #include<string>
            #include<cstring>
            #include<iomanip>
            using namespace std;

            class Record
            {

            public:

                Record()
                {
                    StartRecord();
                }
                void StartRecord()  {   startTime=clock();  }  /*重置開始時間*/
                void PrintCostTime()
                {
                    curTime=clock();
                    cout<<(curTime-startTime)/1000;
                }
                private:
                unsigned int startTime,curTime;
            };


            #endif

            Rand.h
            #ifndef RAND__HH__HH
            #define RAND__HH__HH
            #include<cstdlib>
            #include<ctime>
            using namespace std;
            int RandIn(int left,int right)
            {

                if(left>=right)
                    return left;
                int res=rand();
                res=res%(right-left);
                res+=left;
                return res;
            }
            #endif

            SelectKth.h

            template <class T>
            int SelectMiddle(T A[],int left,int right)
            {
                int middle=((left+right)>>1),p;
                if( A[left]<A[middle] )
                {
                    if(A[middle] <= A[right])
                        p=middle;
                    else    //A[middle] is the biggest
                        p=(A[left] < A[right]) ? right :left;
                }
                else    //A[left]>=A[middle]
                {
                    if(A[right]>A[left])
                        p=left;
                    else    //A[left] is the biggest
                        p=(A[middle]< A[right]) ? right :middle;
                }
                return p;
            }

            template <class T>
            T SelectKth(T A[],int left,int right,int kth)
            {
                int i, store;
                int p=SelectMiddle(A,left,right);
                swap(A[p],A[right]);
                store = left;
                for (i = left; i < right; i++)
                    if (A[i] <= A[right])
                        swap(A[store++], A[i]);
                swap(A[store], A[right]);
                if(store+1==kth)
                    return A[store];
                else if(store+1<kth)
                    return SelectKth(A,store+1,right,kth);
                else    //sotre+1>kth
                    return SelectKth(A,left,store-1,kth);
            }






            類別:算法 查看評論
            posted on 2011-01-21 22:51 YcdoiT 閱讀(336) 評論(0)  編輯 收藏 引用
            四虎国产永久免费久久| 久久久久亚洲av无码专区导航| 国产精品久久久久久吹潮| 亚洲国产精品一区二区久久| 日韩美女18网站久久精品| 亚洲熟妇无码另类久久久| 无码人妻久久一区二区三区免费| 狠狠干狠狠久久| 亚洲愉拍99热成人精品热久久| 久久久女人与动物群交毛片| 久久av免费天堂小草播放| 国产情侣久久久久aⅴ免费| 精品久久久久久国产免费了| 久久午夜无码鲁丝片秋霞| 久久精品成人欧美大片| 久久国产乱子伦精品免费强| 亚洲精品乱码久久久久久不卡| 亚洲综合精品香蕉久久网97 | 精品久久人人做人人爽综合| 狠狠色综合网站久久久久久久高清 | 9久久9久久精品| 亚洲愉拍99热成人精品热久久| 青青青国产精品国产精品久久久久| 久久久久青草线蕉综合超碰| 久久久这里只有精品加勒比| 久久国产热这里只有精品| 久久亚洲私人国产精品| 久久久久久久久久久久中文字幕 | 久久综合九色综合久99| 超级碰久久免费公开视频| 久久国产影院| 91精品国产高清久久久久久国产嫩草| 国产美女亚洲精品久久久综合| 久久99精品国产麻豆不卡| 久久精品一区二区三区不卡| 久久精品国产亚洲AV高清热| 久久综合狠狠综合久久综合88 | 国产精品一区二区久久精品无码| 久久青草国产手机看片福利盒子| 国产精品久久久久久一区二区三区| 色综合久久中文字幕无码|