归并排序是利用了分治的思想,课本所讲的归并插入排序则是设置了一个阈值,当分割出的数组数量低于这个阈值时,对其进行插入排序,不再继续分割这个数组
这是某次算法课的作业
Chapter 4 Exercises (1)
1. Write the pseudo code of the merge-insertion sort described above.MergeInsertSort(list, begin, end, lim):
len = end - begin + 1;
mid = (begin + end)/2;
// InsertSort
if(len < lim):
for i = begin to len:
key = list[i];
j = i - 1;
while(j > 0 and list[j] > key):
list[j+1] = list[j];
j--;
list[j] = key;
// Keep dividing and merge for sorted arrays
else:
len1 = mid - begin + 1;
len2 = end - mid;
new Array l[len1];
new Array r[len2];
for i = 0 to len1:
l[i] = list[begin+i];
for j = 0 to len2:
r[i] = list[mid+1+j];
MergeInsertSort(l, begin, mid, lim);
MergeInsertSort(r, mid, end, lim);
i = 0;
j = 0;
for k = begin to end:
if(l[i] < r[j]):
list[k] = l[i];
i++;
else:
list[k] = r[j];
j++;
2. What is the computational complexity of merge-insertion sort?
$$
\text{首先,对于递归部分,共需要 }k_1=logn\text{ 次;}
\\\text{之后,对于合并与插入排序步骤,所需要的操作次数均为 }k_2=2^i\times \frac{n}{2^i}=n\text{次。}
\\\therefore \text{该归并插入排序的时间复杂度 }T(n)=k_1k_2=O(nlogn)
$$