面试准备--算法

1.快速排序,寻找第k大的数

思想:分治法

#include <stdio.h>

int partation(int *data,int begin,int end)
{
    int key = data[begin];

    while(begin < end)
    {
        while(begin < end && data[end] >= key)
        {end--;}
        if (begin < end) {data[begin++] = data[end];}
        while(begin < end && data[begin] <= key)
        {begin++;}
        if (begin < end){data[end--]=data[begin];} 

    }

    data[begin] = key;
    return begin;
}

void quicksort(int *data,int begin,int end)
{
    if (begin < end)
    {
        int part = partation(data,begin,end);
        quicksort(data,begin,part-1);
        quicksort(data,part+1,end);
    }
}

int find_k(int *data,int begin,int end,int k)
{
    while (begin < end && k >= begin && k <= end)
    {
        int part = partation(data,begin,end);
        if (part == k) 
        {return data[k];}
        else if (k < part)
        {end = part - 1;}
        else
        {begin = part + 1;}
    }

    if (k >= begin && k <= end)
        return data[begin];
    else
        return -1;
}

int main()
{
#if 0
    int data[] = {10,1,10,1};
    quicksort(data,0,sizeof(data)/sizeof(int)-1);
    for (int i = 0 ;i < sizeof(data)/sizeof(int);i++)
    {
        printf("%d\t",data[i]);
    }
#endif
    int data[] = {10,5,200,1000,1,100000,5,312,333,22,11,2};
    printf("%d\n",find_k(data,0,sizeof(data)/sizeof(int)-1,sizeof(data)/sizeof(int)-1));
    for (int i = 0 ;i < sizeof(data)/sizeof(int);i++)
    {
        printf("%d\t",data[i]);
    }
}

 

posted @ 2017-03-31 13:58  dodng  阅读(142)  评论(0)    收藏  举报