最近开始学习C++的STL,眼界豁然开朗,这的确是个很有用的东西。刚刚开始学习,用vector写了一个插入排序的例程和一个Shell排序的例程,并简要做一下分析。
以下是InsertSort的例程:
对于外层的循环for(int i = 1; i < a.size(); i++)来说,数组a的大小为a.size(),这是模板类vector的一个成员函数,初始的变量为数组a的第二个元素a[1];然后进入内层的循环,初始值为a[1],将它与a[0],相比较,若小则将它与a[0]交换。最后一行采用语句:a[ j ] = temp,避免了使用明显的数据交换。
至于InsertSort的性能是显而易见的,它每次嵌套循环都使用了N次迭代,所以它是O(N2)的。
下面来介绍一个使用shell增量的Shell排序的例程代码如下:
对于最外层的for循环来说,它是来控制增量的,这里使用的简单的shell增量,初始值为gap,它的大小为数组大小的1/2,然后逐次减半。里面的两层循环和Insertsort例程的比较类似,所以插入排序可以看成是增量为1时的Shell排序;其中,第二层的循环提供了若干个增量为gap的子序列。最内层的循环则是将子序列中相邻的元素进行比较,并进行交换。
20:03:17