之前的文章介绍了冒泡排序和插入排序,这里再补充一个对半插入排序
算法,它与对半查找算法
(二分查找算法
)有点相似之处。
还是先上代码:
1 | public void HalfInsertSort(int[] array) |
在Program
的Main
函数里New一个(一)中写的那个CSharpArray
类,调用其中的方法测试:
1 | using System; |
输出结果:
排序前:
1 0 2 5 4 1 3 4
排序后:
0 1 1 2 3 4 4 5
为了显示for
循环中的每次执行结果,在HalfInsertSort
方法里加一句输出:
1 | public void HalfInsertSort(int[] array) |
再次编译运行即得以下结果:
排序前:
1 0 2 5 4 1 3 4
排序后:
0 1 2 5 4 1 3 4
0 1 2 5 4 1 3 4
0 1 2 5 4 1 3 4
0 1 2 4 5 1 3 4
0 1 1 2 4 5 3 4
0 1 1 2 3 4 5 4
0 1 1 2 3 4 4 5
0 1 1 2 3 4 4 5
从输出结果可以看出,遍历数组元素,利用对半查找原理找到其位置,插入,将受影响的元素一次前移。
同样,为了将以上的升序排序算法改为降序,也只需将while
括号里的大于号改为小于号即可。
这里,既然将其封装在一个类里,自然要提高其通用性,因此,我可以再给改排序算法添加一个参数,用来标记是升序排序还是降序排序。如:用“0”表示升序,用“1”表示降序,在不降低代码运行效率时以牺牲代码简洁性来修改一下代码:
1 | public void HalfInsertSort(int[] array, int orderType) |
再修改Main
函数里代码:
1 | using System; |
编译运行结果如下所示:
排序前:
2 4 0 3 5 6 1 1
升序排序后:
2 4 0 3 5 6 1 1
0 2 4 3 5 6 1 1
0 2 3 4 5 6 1 1
0 2 3 4 5 6 1 1
0 2 3 4 5 6 1 1
0 1 2 3 4 5 6 1
0 1 1 2 3 4 5 6
0 1 1 2 3 4 5 6
降序排序后:
1 0 1 2 3 4 5 6
1 1 0 2 3 4 5 6
2 1 1 0 3 4 5 6
3 2 1 1 0 4 5 6
4 3 2 1 1 0 5 6
5 4 3 2 1 1 0 6
6 5 4 3 2 1 1 0
6 5 4 3 2 1 1 0
最后,再次贴一下CSharpArray
类的代码:
1 | using System; |
OK,对半插入排序算法的基本演示就到此结束!
注:由于数组时代码里生成的随机数组,因此每次运行的结果基本不一样,可能与以上演示结果不同。