内部排序:整个排序工作可在主存中完成。
外部排序:不能再主存中完成而必须在磁盘上完成的排序。
排序算法的下界:
通过计算排列中平均逆序数而得出插入排序平均运行时间的精确的界。
定理1—N个互异的的数组的平均逆序数是N(N-1)/4。
定理2—通过交换相邻元素进行排序的任何算法平均需要Ω(N^2)时间。
插入排序
算法:插入排序有N-1趟排序组成,对于P=1趟到P=N-1趟,插入排序保证从位置0到位置P-1的元素为已排序状态。
代码:
void InsertionSort(ElementType A[ ],int N)
{
int j,P;
Element Type temp;
for(P=1;P<N;P++)
{
Tmp=A[P];
for(j=p;j>0&&A[j-1]>tmp;j--)
A[j]=A[j-1];
A[j]=tmp;
}
}
插入排序的分析:
由于嵌套循环的每个都花费N次迭代,因此插入排序为O(N^2),而且这个界是精确的,因为以反序输入可以达到该界。精确计算所有的P值,第四行的测试最多执行P+1次,对所有的P求和,得到总数为:
如果输入数据已预先排序,那么运行时间为O(N),因为内层for循环的检测总是立即执行不成立而终止。所以如果插入排序输入几乎被排序,程序将运行地更快,插入排序的平均情形是O(N^2).
参考书籍:数据结构和算法分析-C语言描述