归并排序大量引用了递归,尽管在代码上比较清晰,容易理解,但会造成时间和空间上的性能损耗,所以考虑将递归转化为迭代从而提高性能。
1、code
/*对顺序表L作归并非递归排序*/void MergeSort2(SqlList *L){ int* TR=(int*)malloc(L->length*sizeof(int)); /*申请额外空间*/ int k=1; while(klength) { MergePass(L->r,TR,k,L->length); k=2*k; /*子序列长度加倍*/ MergePass(TR,L->r,k,L->length); k=2*k; /*子序列长度加倍*/ }}/*将SR[]中相邻长度的为s的子序列两两归并到TR[]*/void MergePass(int SR[],int TR[],int s,int n){ while(i<=n-2*s+1) { Merge(SR,TR,i,i+s-1,i+2*s-1); /*两两归并*/ i=i+2*s; } if(i
2、代码执行过程:
k=1时
k=2时
k=4、8时
k=16跳出循环