《算法导论》——顺序统计RandomizedSelect

RandomizedSelect.h:

#include <stdlib.h>

namespace dksl
{
    /*
    *交换
    */
    void Swap(int* numArray,int swapFrom,int swapTo)
    {
        int temp=numArray[swapFrom];
        numArray[swapFrom]=numArray[swapTo];
        numArray[swapTo]=temp;
    }
    
    /*
    *随机化快排
    */
    int RandomizedPartition(int* numArray,int head,int tail)
    {
        int r=rand()%(tail-head+1)+head;
        Swap(numArray,r,tail);

        int pivot=numArray[tail];
        int i=head-1;
        int j=tail;
        while(true)
        {
            do
            {
                i++;
            }while (i<=tail&&numArray[i]<pivot);
            do
            {
                j--;
            }while (j>=head&&numArray[j]>pivot);
            if(j<i)
                break;
            Swap(numArray,i,j);
        }
        Swap(numArray,j+1,pivot);
        return j+1;
    }

    /*
    *选择任意顺序统计量,numArray为待选择数组,head为数组开始位置索引,tail为数组结束位置索引,i为待选择的第i+1小的值
    */
    int RandomizedSelect(int* numArray,int head,int tail,int i)
    {
        if(head==tail)
            return numArray[head];
        int q=RandomizedPartition(numArray,head,tail);
        int k=q-head+1;
        if(i==k)
            return numArray[q];
        else if(i<k)
            return RandomizedSelect(numArray,head,q-1,i);
        else
            return RandomizedSelect(numArray,q+1,tail,i-k);
    }
}

RandomizedSelect.cpp

// RandomizedSelect.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <iostream>
#include "RandomizedSelect.h"

using namespace std;
using namespace dksl;
int _tmain(int argc, _TCHAR* argv[])
{
    int a[10] = {1, 4, 8, 15, 10, 25, 54, 15, 12, 2}; 
    cout<<RandomizedSelect(a,0,9,5)<<endl;    
    system("PAUSE");
    return 0;
}

posted @ 2013-06-28 23:18  Scott Lewis  阅读(513)  评论(1编辑  收藏  举报