您的位置:首页 > 其它

线性时间排序习题

2013-07-22 11:21 134 查看
1.设计一个算法,对N个介于0~k之间的数进行预处理,然后能够在O(1)的时间给出有多少个元素介于[a,b]之间

首先肯定要考虑a,b和K的相对大小,这里就假设0<a<b<k,其他情况类似

1.参照级数排序累计统计

2.对累计统计的结果中计算c-c[a-1]

[b]2.插入排序,归并排序,堆排序和快速排序那些是稳定的,有没有一种方法保证任何排序都是稳定的


首先插入排序和归并排序时稳定的,另外两个是不稳定的

对于快速排序,解决办法是申请一块与待分割元素相同大小的空间,在每一次Pation过程中,扫描两次

第一次扫描比主元小的元素,第二次扫描比主元大地元素,耗时O(2n),这样就保证了稳定性

对于堆排序,为每个元素申请一个额外的空间记录他们的初始位置,比较的时候先比较元素的大小,相同然后比较位置的大小,需要申请O(n)的空间

3.一个包含N条记录的数组,每条记录为0或1,对其进行排序

1.算法时间代价O(n)
2.算法是稳定的
3.为原址排序,空间复杂度为O(1)

问:

a.分别给出满足条件(1,2),(1,3),(2,3)的算法

b.以上的三个算法中有无用于计数排序中的列排序方法,使得在b为关键字的n条记录排序时间为O(bn)

c.假设有N条记录他们的范围为0~k,修改计数排序,使得在用时O(n+k),空间O(k)的情况下原址排序

 a.满足(1,2)------归并排序             满足(1,3)----------快速排序中的一次划分           满足(2,3)--------插入排序

b.计数排序要求稳定,并且时间为O(N),归并排序满足条件

c.数组C[]为计数排序中累计统计后的位置

for i =length to 1
{
temp1=A[i];
if(c[temp1]==i)
continue;
else
while(c[temp1]!=i)
{
temp2=A[c[temp1]];
A[c[temp1]]=temp1;
c[temp1]--;
temp1=temp2;
{
}


4.水壶问题

有n个蓝水壶和相同数量的红水壶,每个蓝水壶容量都不同,且有一个红水壶水壶与之对应

问怎么在O(n^2)时间配对,O(nlogn)呢?证明比较次数下界O(nlogn)

在O(n^2)时间配对------选择排序思想,每次选一个蓝水壶,挨个比较

O(nlogn)---快速排序思想首先选一个蓝水壶,对其划分,会得到三种水壶

容量比它大,小或者相等,然后取与它相同的红水壶对蓝水壶进行划分

证明下界同决策树
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  计数排序 算法