线性时间的选择算法

来源:互联网 发布:mysql unique 修改 编辑:程序博客网 时间:2024/04/30 14:45

线性时间的选择算法

 

这里RANDOMIZED-SELECTED的核心思想就是:

1)     如果刚好找到第i小的,直接返回

2)     如果第i小的元素在左边,那么继续找第i小的

3)     如果第i小的元素在左边,那么继续找第i小的



#include #include #include #include#include #define MAXN 10000using namespace std;// 顺序统计量:找第i个量template// i[1...n]T randomized_select( T a[], int p, int r, int i );int main( void ){    int a[MAXN];    int i=0,j=0,k=0;    int temp;    int num,sum;    double stime=0;    double mtime=0;    double index1=0 , index2=0;    int index;    SYSTEMTIME sys;    cout << "请输入产生随机数的数目:";    cin >> num;    cout << "请输入程序进行的次数:";    cin >> sum;    cout << "请问你想找到第几小的数:";    cin >> index;    for(k=0 ; k( a, 0, num - 1, index );        cout << data << "\t";        //结束的时间        GetLocalTime( &sys );        //时间集合        stime += (sys.wSecond - index1);        if( sys.wMilliseconds < index2){            stime--;            mtime += 1000;        }        mtime += (sys.wMilliseconds - index2);        while(mtime > 1000){            mtime -=1000;            stime +=1;        }    }    cout << endl;    //输出    cout << "总时间为:" << stime << "." << mtime << "秒" << endl;    double avr = (stime*1000 + mtime)/num;    cout << "平均时间为:" << avr << "毫秒" << endl;    return 0;}void swap( int* a, int* b ){    int tmp = *a;    *a = *b;    *b = tmp;}// 固定分割算法templateint partion( T a[], int p, int r ){    int i, j;    i = p - 1;    for( j = p; j < r; ++j ){        if( a[j] < a[r] ){            swap( &a[j], &a[++i] );        }    }    swap( &a[r], &a[++i] );    return i;}// 随机分割算法templateint randomized_partion( T a[], int p, int r ){    if( p > r )        return -1;    static int first_time = true;    if( first_time ){        first_time = false;    }    int loc = rand() % ( r - p + 1) + p;    swap( a[r], a[loc] ); // 随机选定一个数,然后把它放到最后面,就可以统一方法了    return partion( a, p, r );}// 顺序统计量:找第i个量templateT randomized_select( T a[], int p, int r, int i ){// i 从1开始    if( p == r )        return a[p];    int q = randomized_partion( a, p, r );int k = q - p + 1;    //如果刚好找到第i小的,直接返回    if( i == k )        return a[q];        //如果第i小的元素在左边,那么继续找第i小的    else if( i < k )        return randomized_select( a, p, q - 1, i );            //如果第i小的元素在右边,那么找第i-k小的元素    else        return randomized_select( a, q + 1, r, i - k );}

1 0