我有一个n个元素的排序数组。现在我给了n / 2个元素,每个元素都属于排序数组。 n / 2个元素是从排序数组中随机获取的。如何在线性时间内对这些n / 2元素进行排序?
答案 0 :(得分:8)
一种方法涉及散列。构建一个包含从数组中提取的所有n / 2个元素的哈希集。如果允许重复,则从元素到其频率构建哈希表。这将需要O(n)时间,期待。
然后,按升序迭代排序的数组,并且对于数组的每个元素,检查它是否在哈希集/哈希表中。如果是这样,请将该元素附加到输出数组(如果允许重复,则在集合中每个元素的副本执行一次)。对于数组的每个元素,这将需要O(1)时间,因此该步骤也需要时间O(n)。
因此,预期的总运行时间为O(n)。
希望这有帮助!
答案 1 :(得分:0)
如果元素适合一个数组,则可以使用另一个布尔数组,该数组标记已选择的元素boolean [] selected
因此,通过遍历此数组,并仅打印出已标记为已选中的元素,您可以获得所需的效果。
编辑:通过装饰返回对象,我们甚至可以对这些随机值的子集进行排序
boolean [] selected;
Object [] data;// the array of elements
ReturnObject getRandom(){
int index = random();
selected[index] = true;
return new ReturnObject(index,data[index]);
}
void printSelected(){
for(int i = 0; i < data.length; i++){
if(selected[i]){
print(data[i]);
}
}
}
void printSubset(ReturnObject[]set){
boolean []selected = ....
for(int i = 0; i < set.length; i++){
selected[set[i].index] = true;
}
for(int i = 0; i < data.length; i++){
if(selected[i]){
print(data[i]);
}
}
}
class ReturnObject{//Class decorating the return object, which includes its index in the data array
int index;
Object data;
}