七月的风,八月的雨,卑微的我喜欢遥远的你……
大家好,我是看见星光。 长期关注我们EH公众号的朋友都知道,老祝家有个丫头在统计局上班,她曾经眼睛都不眨的对我说过这样一句话: 排序是数据分析与处理过程中最常见也是最重要的问题之一,搞定排序可以提升工作效率3.485626%…… 看在老祝爱发红包的份上,我当然对她这话发自肺腑的相信,所以曾发过两篇推文: Excel自带的排序功能确实已经足够强大,既能单列排序也能多列排序,既能按数值排序还能按颜色排序,甚至支持自定义规则排序,而且排序效率也非常优秀…… 不过,有些情况,就不适合使用工作表排序方案了。比如…… 大小不一合并单元格的情况下它会罢工。 复杂数据结构下的排序它会歇菜。 另外,毕竟这家伙是基于单元格对象的,如果咱们需要排序的数据并非存放在单元格中,它就更爱莫能助了。 比如VBA数组内部的元素如何排序? 恩,很遗憾,VBA数组并没有像其它语言那样自带排序的属性方法。 当此危难时刻,说不得咱就得自力更生,掌握点传说中编程的核心科技……排序算法了。 排序算法有很多,但复杂的咱们没闲心管,少用的我们也懒得理,所以就分享三个最常用最简单的:计数排序,冒泡排序,快速排序。 2, 先说计数排序。 为什么先说它呢?不是它长的帅,理智+帅气如我不会犯如此幼稚的错误,原因只有一个——这货最简单。 什么是计数排序?简单的说,就是利用数组下标来确定元素的正确位置,在数组中记录元素出现的次数,最后得出有序数据。 举个例子还是。 如下图所示,为某公司几位拥有百万年薪……小职员的考核得分表,得分范围是1~10之间的整数。 现在,我们需要把“看见星光”……也就是理智+帅气的在下了……的得分按升序排列,结果如下。 …… 首先,我们根据得分的范围,也就是最低分1,最高分10,建立一个数组。 Redim r(1 to 10) 如此一来,我们声明了一个数组r,里面包含10个元素。数组是有序的元素集合,因此第一个元素就是r(1),第2个元素就是r(2)……其余以此类推。 目前这个数组是空的,刚建国,一穷二白,啥都没有。 然后我们遍历数据,按号入座,把每个得分按照对应的数组索引号计入数组,并累加出现次数。 比如说7,那就是r(7)=r(7)+1 当7第一次出现时,r(7)=1 当7第二次出现时,r(7)就等于1+1,也就是2……对吧? 于是代码如下
数据遍历完成后,数组的情况就成了下图这样。 1、4、6、10各出现了一次,计数为1,7出现了两次,计数为2. …… 最后,我们根据数组记录的次数,依次把数据算出就OK了。 r(1)存在1次,说明数据源出现过一个1,于是我们得出一个1 r(2)为空,不管它 r(3)为空,不管它 r(4)存在1次,说明数据源出现了一个4,于是我们得出一个4 r(5)为空,不管它 r(6)存在1次,我们得出一个6 r(7)存在2次,说明数据源出现了两个7,于是我们得出7和7 …… 因此最后得出升序排序结果1、4、6、7、7、10 整个过程的完整代码如下:
|
|