• 笔试之算法


    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	", a[i]);
        printf("
    ");
    }
    
    //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 堆排序

  • 相关阅读:
    set集合
    字典的使用与操作
    列表和字符串
    bzoj 4927: 第一题
    bzoj 3031: 理科男
    bzoj2263: Pku3889 Fractal Streets
    bzoj 1288: Neighbours
    bzoj2026: [SHOI2009]Coin
    bzoj3326: [Scoi2013]数数
    bzoj1494: [NOI2007]生成树计数
  • 原文地址:https://www.cnblogs.com/wiessharling/p/4255262.html
Copyright © 2020-2023  润新知