• <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 閱讀(333) 評論(0)  編輯 收藏 引用
            中文字幕无码av激情不卡久久| 亚洲精品国产成人99久久| 久久青青草原精品国产软件| 一本色道久久88综合日韩精品 | 无码AV中文字幕久久专区| 国内精品久久久久久久97牛牛| 亚洲国产精品人久久| 深夜久久AAAAA级毛片免费看 | 国产精品美女久久福利网站| 久久综合狠狠综合久久综合88| 国产成人精品久久亚洲高清不卡 | 欧美精品国产综合久久| 伊人久久免费视频| 亚洲成色WWW久久网站| 无码精品久久一区二区三区| 99re这里只有精品热久久| 无码乱码观看精品久久| 欧美综合天天夜夜久久| 久久婷婷五月综合国产尤物app| 狠狠色伊人久久精品综合网| 久久99精品国产一区二区三区 | 久久婷婷国产综合精品| 久久久午夜精品福利内容| 国产香蕉97碰碰久久人人| aaa级精品久久久国产片| 亚洲欧美成人综合久久久| 亚洲伊人久久综合影院| 久久成人国产精品一区二区| 国产精品欧美久久久天天影视| 精品国产乱码久久久久久呢| 久久这里都是精品| 亚洲国产精品无码久久九九| 人妻中文久久久久| 理论片午午伦夜理片久久| 久久久久久久综合综合狠狠| 久久久久18| 武侠古典久久婷婷狼人伊人| 蜜桃麻豆www久久国产精品| 四虎亚洲国产成人久久精品| 亚洲人成网站999久久久综合 | 国产精品成人久久久久三级午夜电影 |