算法导论8-2 以线性时间原地排序
假设有一个有n个数据记录组成的数组要排序,且每个记录的关键字的值为0或1。排序这样一组记录的一个算法应具备如下三个特性中的一部分。
1)算法的运行时间为O(n)。
2)算法是稳定的。
3)算法是原地排序的,它可以使用除输入数组以外的固定量的存储空间。
a)给出一个满足上述条件1和条件2的算法。
b)给出一个满足上述条件1和条件3的算法。
c)给出一个满足上述条件2和条件3的算法。
d)在a)~c)中给出的算法能否用来在O(bn)时间内排序,对有b位关键字的n个记录进行基数排序?如果行,说明如何做;如果不行,说明原因。
e)假设一个n个记录中每个的关键字都介于1到k之间。说明如何修改计数排序,使得可以在O(n+k)时间内对n个记录原地排序。除输入数组外,可另用O(k)的存储空间。你给出算法是稳定的吗?(提示:当k=3时应该如何做)
解答提要:
a)计数排序
b)快排的划分思想,因为只有0,1故而一次划分即可
c)插入排序之类的都可以
d)第一个可以,第二个不行(不稳定),第三个也不可以(时间效率)
e)思路,计数排序,使用两个数组A[n],C[k],其中A味输入数组,C为记录各数字出现次数的数组,然后直接由C生成输出数组存放在A中。 不稳定的!