1.核心思想:
每步将一个待排序的记录,按其关键码值的大小插入前面已经排序的文件中适当位置,直到全部插入为止,得到一个新的有序序列。
2.排序演示:
3.排序方法:
⒈ 从第一个元素开始,该元素可以认为已经被排序
⒉ 取出下一个元素,在已经排序的元素序列中从后向前扫描
⒊ 如果该元素(已排序)大于新元素,将该元素移到下一位置
⒋ 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置
⒌ 将新元素插入到下一位置中
⒍ 重复步骤2~5
4.代码部分
(1).这是严格按照定义书写的代码(由大到小排序):
<span style="font-size:18px;">'对10个随机数由大到小进行排序,用插入排序法
'对随机数从第2个一直遍历到第10个
For i = 2 To 10
'如果第i个数大于他的前一个数,就执行下面的操作
If a(i) > a(i - 1) Then '不满足这个条件,证明a(i)已经小于了前面所有的数,不需做比较,直接就可以扩充为一个有序区
'把数组a(i)的值保存在变量temp中
temp = a(i)
'让temp和他前面所有的数(设下标为j)从 右向左依次做比较,,如果temp>a(j),则将a(j)的值向后移,直到遇到temp<a(j)为止
'j等于i-1 到 1
For j = i - 1 To 1 Step -1
'如果temp<a(j),就说明了temp<a(j)之前的所有数,不需要再做比较,直接退出就可以
If temp < a(j) Then Exit For
'否则将a(j)的值向后移到a(j+1)的位置,腾出a(j)空间
a(j + 1) = a(j)
Next j
a(j + 1) = temp
End If
Next i</span>
(2)可以将a[j+1]插入到前面a[0…j]的有序区间所用的方法进行改写,用数据交换代替数据后移。如果a[j+1]前一个数据a[j] < a[j+1],就交换a[j]和a[j+1],再j--直到a[j+1] >= a[j]。这样也可以实现将一个新数据新并入到有序区间。
'遍历数组元素从第2个到第10个
For i = 2 To 10
'让数组第i个元素中的数据和它前面的元素从右到左进行比较,大于它前一个元素则交换位置
For j = i - 1 To 1 Step -1
If a(j) > a(j + 1) Then Exit For
'交换位置
t = a(j): a(j) = a(j + 1): a(j + 1) = a(j)
End If
Next j<span style="font-size: 18px;">
Next i</span>