尝试提高数组中此搜索的效率

时间:2015-06-05 17:26:28

标签: algorithm sorting stl

假设我有一个输入数组,其中所有对象都是非等价的 - 例如[13,2,36]。我希望输出数组为[1,0,2],因为13大于2所以“1”,2大于无元素所以“0”,36大于13和2所以“2”。如何使输出数组的效率优于O(n2)? 编辑1:我还想以相同的顺序打印输出。如果可能,请提供c / c ++代码。

4 个答案:

答案 0 :(得分:0)

克隆原始数组(并保留元素的原始索引)并快速排序。快速排序数组中元素的值应为quicksorted.length - i,其中i是新快速排序数组中元素的索引。

[13, 2, 36] - original
[36(2), 13(1), 2(0)] - sorted
[1, 0, 2] - substituted

答案 1 :(得分:0)

def sort(array):
    temp = sorted(array)
    indexDict = {temp[i]: i for i in xrange(len(temp))}
    return [indexDict[i] for i in array]

我意识到它在python中,但仍然应该帮助你

答案 2 :(得分:0)

Schwartzian变换:装饰,排序,不装饰。

创建一个包含对象和索引的结构。从列表中创建这些结构的新列表。按计划按对象排序。从排序列表中创建索引列表。

答案 3 :(得分:0)

似乎像动态编程。 可能这可以帮助 这是一个O(n)算法

1.声明一个最大尺寸为1000001的数组;

2.遍历所有元素并使arr [input [n]] = 1,其中input [n]是元素

3.遍历arr并添加上一个索引(以保持arr [i]的记录大于多少元素)这样

  arr[i]+=arr[i-1]

示例:如果输入[] = {12,3,36}
在第2步之后
ARR [12] = 1,ARR [3] = 1,ARR [36] = 1;
在第3步之后 ARR [3] = 1,ARR [4] = ARR [3] + ARR [4] = 1(ARR [4] = 0,ARR [3] = 1),
ARR [11] = ARR [10] = ARR [9] = ARR [8] = ARR [7] ARR [6] = ARR [5] = ARR [4] = 1
ARR [12] = ARR [11] + ARR [12] = 2(ARR [11] = 1,ARR [12] = 1)
arr [36] = arr [35] + arr [36] = 3(因为arr [13],arr [14],... arr [35] = 2而arr [36] = 1)

4.遍历输入数组,打印arr[input[i]]-1,其中i是索引。

所以arr [3] = 1,arr [12] = 2,arr [36] = 3;
如果你打印arr [input [i]],那么输出将是{2,1,3}所以我们需要从每个元素中减去1,然后输出变为{1,0,2},这是你想要的输出。

// pseude code

int arr[1000001];
int input[size];//size is the size of the input array
for(i=0;i<size;i++)
     input[i]=take input;//take input
     arr[input[i]]=1;//setting the index of input[i]=1; 
for(i=1;i<1000001;i++)
     arr[i]+=arr[i-1];

for(i=0;i<size;i++)
    print arr[input[i]]-1;//since arr[i] was initialized with 1 but you want the input as 0 for first element(so subtracting 1 from each element)

要更好地理解算法,请用纸和笔进行干运行。这将有助于更好地理解。

希望它有所帮助 快乐编码!!