算法导论7:选择算法和数据结构准备 2016.1.7

  刚整理完史纲期末复习资料,所以今天看的比较少,也不是很仔细。所以今天就只说一下自己的理解吧。

  在最值选法讲完之后,书上又讲了选择算法,所谓选择算法就是选取中位数,更一般的,选取第k小的元素的算法。

  实际上我理解的话,就是的排序算法思想的借鉴,书上的5个5个分的选中位数的没太看懂,这里就说两个我想的算法吧。

  第一个是堆排序的改编。因为堆排序整理一次就可以获得一个最小值,所以整理k次就可以选取出第k小的值。复杂度是klgn。选取中位数的话,就是选取第n/2小的值。

  第二个是计数排序的改编。因为计数排序更直接的,直接存储了小于等于每个数的个数。

    假设现在c[1..n]。c[k]存储了n个数中<=第k个数的元素个数。那么一遍扫描,找出最接近n/2且>=n/2的那个就是中位数了。

    当然,想象中是这样,只需要稍作修改分一下奇数和偶数讨论一下就行了。

堆排序的改编比较简单,就不贴代码了,只贴一下计数排序的那个代码。

#include<stdio.h>

int a[20],c[150];
int max;

float jishumid(int n)
{
    int i;
    for (i=1;i<=n;i++) {
        c[a[i]]++;
    }
    for (i=1;i<=max;i++) {
        c[i]+=c[i-1];
    }    
    if (n%2==1){
        for (i=0;i<=max;i++) {
            if (c[i]>n/2) return (float)i;            
        }
    }
    else {
        for (i=0;i<=max;i++) {
            if (c[i]>=n/2) break;
        }
        int k1=i;
        while (c[i+1]==c[i]) i++;
        int k2=i+1;
        return (float)(k1+k2)/2;
    }
}

int main()
{
    int n;
    scanf("%d",&n);
    int i;
    for (i=1;i<=n;i++) {
        scanf("%d",&a[i]);
        if (a[i]>max) max=a[i];
    }
    float k;
    k=jishumid(n);
    printf("%.2f",k);
    return 0;
}


那么,这一章就告一段落了,下一章就开始讲数据结构了,大致看了一下概述,数据结构就是集合的操作,后面为了方便,代码可能会用到c++的引用特性,要不然编指针的数据结构函数太复杂了。QAQ

posted @ 2016-01-08 00:00  lvmememe  阅读(331)  评论(0编辑  收藏  举报