排序不同长度的数据项

来源:互联网 发布:淘宝banner加链接 编辑:程序博客网 时间:2024/05/22 15:13

问题一:给定一个整数数组,其中不同的整数中包含的数字个数可能不同,但该数组中,所有整数中总的数字数是n。说明如果在O(n)时间内对该数组进行排序。

 

解体思路:

1. 数组中的元素总共m个,对每个元素构造struct{element, length},将这m个struct进行桶排序,存入Bucket[1], ..., Bucket[k]中,合并到数组T中。过程1算法复杂度为O(m)。

2. 进行基数排序:i从1到k,第i次循环时,分两种情况讨论:

      (1)将T中元素的第i位进行计数排序,并将struct.length = i的元素依照其在T中的先后顺序压入数组O末尾,删除T中的这些struct,继续下一次循环。

      (2)如果T中元素只剩一个,则将该元素压入数组O末尾,跳出循环。

    过程2每一次循环的算法复杂度为O(10 + 拥有第i位的元素数目)

3. 循环结束时,数组O便是排好序的数组了,元素顺序从小到大。

分析复杂度,我们不难看出,为O(n)。

 


 

 

问题二:给定一个字符串数组,其中不同的串包含的字符数可能不同,但所有串中总的字符个数为n。说明如何在O(n)时间内对该数组进行排序。(注意此处的顺序是指标准的字母顺序,例如,a<ab<b)

 

解题思路:

1. 数组中的字符串元素总共m个,对每个元素构造struct{element, length},将这m个struct进行桶排序,存入Bucket[1], ..., Bucket[k]中。过程1的算法复杂度为O(m)。

2. 进行基数排序:i从1到k,第i次循环时,将Bucket[k -i + 1]的元素并入T末尾,并对T中元素T[i]的第(T[i].length - k + i)位计数排序,从大到小。过程2每一次循环的算法复杂度为O(26 + Bucket[k - i + 1]到Bucket[k]中的元素数目)

3. 当i = k循环结束后,排序结束,取出T中的element即可。

分析复杂度,我们不难看出,为O(n)。

原创粉丝点击