Divison and Recursion-find_kth_element

#include <iostream>
using namespace std;


void swap(int array[], int beginPos, int endPos){
    int t = array[beginPos];
    array[beginPos] = array[endPos];
    array[endPos]=t;
}

int partition(int array[], int beginPos, int endPos){
    int curVal = array[beginPos];
    int headCursor = beginPos+1;
    int tailCursor = endPos;

    while(true){
        while((array[headCursor] < curVal) && (headCursor < endPos))  headCursor++;
        while(array[tailCursor] > curVal) tailCursor--;
        if (headCursor>=tailCursor){break;}
        swap(array, headCursor, tailCursor);
    }
    swap(array, beginPos, tailCursor);
    return tailCursor;
}

int find_kth_element(int array[], int beginPos, int endPos, int k){
    int curIndex = 0;
    int curPos = 0;

    curIndex = partition(array, beginPos, endPos);
    curPos = curIndex - beginPos + 1;
    if (curPos == k){return array[curIndex];}
    else if(curPos > k){find_kth_element(array, beginPos, curIndex, k);}
    else{find_kth_element(array, curIndex+1, endPos, k-curPos);}

}

int main(){
    int array[7]={5,4,2,8,3,6,7};

    for (int i = 0; i < 7; i++){
        cout<<array[i]<<" ";
    }
   
    cout<<"find kth element:"<<find_kth_element(array, 0, 6, 5)<<endl;
    return 1;
}

posted @ 2016-03-16 08:37  zhaodonglin  Views(177)  Comments(0)    收藏  举报