给定n个元素的排序数组,在​​线性时间内对n / 2个元素进行排序

时间:2014-02-12 03:15:35

标签: arrays algorithm sorting time-complexity

我有一个n个元素的排序数组。现在我给了n / 2个元素,每个元素都属于排序数组。 n / 2个元素是从排序数组中随机获取的。如何在线性时间内对这些n / 2元素进行排序?

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;
}