• <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)  編輯 收藏 引用
            久久精品视频91| 久久综合九色欧美综合狠狠| 久久久久亚洲AV无码专区网站 | 亚洲AV成人无码久久精品老人| 久久久久久久久久久免费精品| 99久久99久久精品国产片果冻| 99久久国产热无码精品免费| 国产精品免费看久久久| 久久精品9988| 伊人色综合久久天天| 精品久久人人妻人人做精品 | 久久久久人妻精品一区二区三区| 久久WWW免费人成一看片| 国产一区二区久久久| 国内精品综合久久久40p| 久久香蕉超碰97国产精品| 久久亚洲精品无码播放| 亚洲午夜精品久久久久久app| 中文成人无码精品久久久不卡| 久久精品亚洲AV久久久无码| 久久棈精品久久久久久噜噜| 中文字幕亚洲综合久久| 亚洲美日韩Av中文字幕无码久久久妻妇 | 天天影视色香欲综合久久| 香蕉久久夜色精品国产2020 | 69久久精品无码一区二区| 激情五月综合综合久久69| 久久久久国产精品人妻| 久久免费国产精品一区二区| 婷婷久久五月天| 粉嫩小泬无遮挡久久久久久| 精品久久久久中文字幕一区| 久久影院综合精品| 久久久人妻精品无码一区| 久久精品国产亚洲AV香蕉| 久久男人中文字幕资源站| 97久久久久人妻精品专区| 热综合一本伊人久久精品| 韩国无遮挡三级久久| 99久久国产宗和精品1上映| 久久精品夜色噜噜亚洲A∨|