vlambda博客
学习文章列表

挑战下你的VBA水平(希尔排序法)!

我的目标:让中国的大学生走出校门的那一刻就已经具备这些office技能,让职场人士能高效使用office为其服务。支持我,也为自己加油!


我现在越来越觉得学习VBA难点在于解决问题的思路,而非无穷无尽的陌生的对象。


大家都知道,学习VBA其实就是学习一个个的对象,学习这些对象的属性及方法,比如Range、Workbook、Worksheet等等对象。大部分情况下,只要熟悉这些对象和VBA的基本语句结构,比如循环、判断、选择等,就可以解决很多问题。


只要掌握了基本规律,这些学起来都比较容易,可以即用即学。学的越多,学起来就越容易,因为很多对象的属性、方法都具有相似性。


但是解决问题时的思路却不是那么容易学习到的,需要一定的训练,比如简单的循环、判断语句,

什么时候循环呢?

什么时候停止循环呢?

什么时候判断呢?

判断的时候分几种情况呢?

每一种情况下是否又有其它情况呢?


情况比较复杂时,很多同学就会出现看似基本的语句结构却怎么也理不清楚的情况?


这也就是最近我为啥总写排序算法的原因,对于锻炼思维一定是非常好的练习题目。网上用其它语言写排序算法的比较多,用VBA写的很少。


今天分享下希尔排序法,读懂原理后大家可以试着动手写写代码。建议先把插入排序法搞懂,再来学习希尔排序法。



先来看下基本概念:

希尔排序法其实是插入排序法的升级版,是将整个无序列分割成若干小的子序列分别进行插入排序的方法,所以也叫做缩小增量法排序法


具体怎么做的呢?


举个例子:



对上图中的53、19、15、10、16、8、7、18、1、56十个元素进行排序。

首先根据元素个数将元素分为5(10/2=5)组,每组元素间的间隔为5。
[53,8],[17,7],[15,18],[10,1],[10,56]
然后对每一组数据分别进行插入法排序。

排序后结果就变为:
挑战下你的VBA水平(希尔排序法)!
然后再缩小元素间的间隔,上一次的间隔/2取整数,即int(5/2)=2,分两组,结果如下:

然后用插入法排序,结果如下:


这时整个序列的有序程度已经比较高了,再继续缩小元素间间隔,int(2/2)=1
,即一个元素一组,进行插入法排序,这时仅需要移动很少的元素就可以完成排序了。

注意,这里的排序只是逻辑上的排序,而不是说把整个序列分割成独立的几组进行分别进行排序。

这就是所谓的希尔排序法,因为是Shell这个人发明的,所以就以他的名字命名了。

大家可以试着把上面的过程写成代码:
Sub Shell_Sort() Dim arr, arr1() Dim l&, r&, gap&, i&, j& arr = Array(53, 19, 15, 10, 16, 8, 7, 18, 1, 56) l = LBound(arr) r = UBound(arr) gap = r + 1Do ReDim arr1(l To r) gap = Int(gap / 2) '间隔 '把每一组的第一个元素装入新数组中 For i = l To gap - 1 arr1(i) = arr(i) Next '遍历元素的元素(每一组第一个元素除外) For i = gap To r '在arr1中从i-gap位置向前扫描找到位置并插入 For j = i - gap To l Step -gap If arr(i) < arr1(j) Then arr1(j + gap) = arr1(j) Else arr1(j + gap) = arr(i) Exit For End If arr1(j) = arr(i) Next j Next i '把arr1赋给arr,继续循环 arr = arr1 Erase arr1Loop Until gap = 1 '直到间隔为1时退出循环
End Sub




本节的分享就到这里,祝大家每天都有进步。

成为米宏office学堂终身会员有啥好处:

1、米宏云课堂的视频永久免费观看

2、日后录制的视频可以免费观看

3、视频中不懂的可以提问

5、可以帮助解决视频中未提到,文章中未写到的典型问题

期待真心想提高office水平的朋友,非诚勿扰!

点击“阅读原文”,发现惊喜哦!