線性時間選擇

通常解決的問題是求一個n個數的列表中第K個最小的元素。這個數字被稱爲第K個順序統計量。數組

//對數組元素data[lowhigh]進行分區操做,0號單元不用
int partion(int data[],int low,int high)
{
    data[0]=data[low];
    int pivotkey=data[low];
    while(low<high)
    {
        while(low<high&&data[high]>=pivotkey)
            --high;
        data[low]=data[high];
        while(low<high&&data[low]<=pivotkey)
            ++low;
        data[high]=data[low];
    }
    data[low]=data[0];
    return low;
}
/*查找data[pr]中第k大的數.
**平均狀況下,它比快速排序應該要快,由於分區以後只用處理一個子數組,而
**而快速排序要處理兩個獨立的子數組。
**T(n)=T(n/2)+(n+1)
**T(n)=O(n)
*/
int lineselect(int data[],int p,int r,int k)
{
    //p不能大於r
    if(p>r)
        return -1; 
     if(p==r)
           return data[p];
    //p<r
    int s=partion(data,p,r);
    if (s==k)
        return data[s];
    else if(s>k)
    {
        int r1= lineselect(data,p,s-1,k);
        return r1;
    }
    else  //s<k
    {
        int r1=lineselect(data,s+1,r,k);
        return r1;
    }
}
/*快速排序:
**T(n)=2T(n/2)+n
**T(n)=nlogn
*/
void QSort(int *v,int low,int high)
{
    int pivotloc=0;
    if(low<high)
    {
        pivotloc=Partition(L,low,high);
        QSort(v,low,pivotloc-1);
        QSort(v,pivotloc+1,high);
    }
}
相關文章
相關標籤/搜索