笔试之算法

1. 排序算法

1.1 6个2T的盘中存满了整型数,总共8G内存 再给新的6个2T的硬盘和8G内存,问怎样把之前的数排序之后放入新的硬盘之中?

1.2 求n个数中前K大的数,要写代码

  过程说明:

  首先建立一个临时数组,数组大小为K,从N中读取K个数,降序全排序(排序算法可以自行选择,考虑数组的无序性,可以考虑选择快速排序算法),然后依次读入其余N - K个数进来和第K名元素比较,大于第K名元素的值则插入到合适位置,数组最后一个元素溢出,反之小于等于第K名元素的值不进行插入操作。只待循环完毕返回临时数组的K个元素,即是需要的K个最大数。同算法一其平均时间复杂度为O(KLogK + (N - K))。具体代码实现可以自行完成。

#define K 10

void swap(int* a, int *b)
{
    int tmp = *a;
    *a = *b;
    *b = tmp;
}

int partition(int a[], int low, int high)
{
    int privotKey = a[low];
    while(low < high)
    {
        while(low < high && a[high] <= privotKey)
            --high;
        swap(&a[low], &a[high]);
        while(low < high && a[low] >= privotKey)
            ++low;
        swap(&a[low], &a[high]);
    }
}

void quickSort(int a[], int low, int high)
{
    if(low < high)
    {
        int privotLoc = partition(a, low, high);
        quickSort(a, low, privotLoc - 1);
        quickSort(a, privotLoc + 1, high);
    }
}

void print(int a[], int len)
{
    int i;
    for(i = 0; i < len; ++i)
        printf("%d\t", a[i]);
    printf("\n");
}

//a from big to small, b is not known
void joinSort(int a[], int len_a, int b[], int len_b)
{
    int i;
    for(i = 0; i < len_b; ++i)//for b[]
    {
        int index = len_a-1;
        if(b[i] > a[index])
        {
            while(b[i] > a[index] && index >= 0)
                index--;

            //后移动
            int j;
            for(j = len_a-1; j > index+1; --j)
            {
                a[j] = a[j-1];
            }

            a[index+1] = b[i];
        }
    }
}
void maxk(int a[], int len)
{
    int temp[K];
    int i = 0;
    for(i = 0; i < K; ++i)
    {
        temp[i] = a[i];
    }

    quickSort(temp, 0, K - 1);
    joinSort(temp, K, a+K, len-K);
    print(temp, K);
}

 1.3 堆排序

posted @ 2015-01-28 11:02  wiessharling  阅读(329)  评论(0编辑  收藏  举报