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