• 算法导论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

  • 相关阅读:
    Ueditor富文本编辑器
    ashx误删后,未能创建类型
    一个菜鸟的ASP.NET观光路线图
    地位尴尬的WebForm、ASP.NET核心知识(10)
    经典排序算法--归并排序
    经典排序算法--快速排序
    经典排序算法--冒泡排序
    经典排序算法--堆排序
    经典排序算法--简单选择排序
    经典排序算法--希尔排序
  • 原文地址:https://www.cnblogs.com/itlqs/p/5111737.html
Copyright © 2020-2023  润新知