如果只有从1到n的元素,是否可以在O(n)中对数组进行排序?

时间:2016-06-07 18:01:42

标签: arrays algorithm sorting

假设数组中元素的比较采用O(n),当数组从1到n时,是否可以在O(n)中对数组进行排序?

我们需要创建一个这样的算法,但不知道它是否可能。我可以想到O(n ^ 2)中的一个。 我不是要求算法,会花时间创建一个,但需要知道它是否可行。

3 个答案:

答案 0 :(得分:2)

绝对可以这样做,你只需创建一个带有计数器的数组,并计算元素 i 发生的次数,因为元素范围从 1 到< em> n ,你知道这个计数器的长度为 n

接下来是生成步骤,如果遇到 k ,只需生成 k i 元素 i 这样的元素。

Java中的示例代码:

int[] data = {5,1,2,4,5,1,2,3};

//assuming data contains only values from 1 to n (included) with n the length
public static int[] sort_int_limited (int[] data) {
    int n = data.length;
    int[] counters = new int[data.length];

    //counter phase
    for(int i = 0; i < n; i++) {
        counters[data[i]-1]++;
    }

    //generate phase
    int k = 0;
    for(int i = 0; i < n; i++) {
        for(int j = 0; j < counters[i]; j++) {
            data[k++] = i+1;
        }
    }

    return data;
}

ProximityDevice.SubscribeForMessage

正如@Aivaen在jDoodle demo中所说,此算法称为计数排序

答案 1 :(得分:1)

是“Bucket sort”:     声明大小为n的数组,将其调用为arr,将其设置为零,

2.对于给定输入数组中的每个值:

  add one in arr in the index that is equal to the value

声明新数组: 声明int k = 0

3.for i in input array

if arr[inputarray[i]>0 do:

    1.out[k]= arr[i]
    2.arr[inputarray[i] = arr[inputarray[i] -1
    3. k=k+1

退出

答案 2 :(得分:0)

目前尚不清楚“数组中元素的比较需要O(n)”是什么意思。如果数组的大小是“s”,则可能的比较次数是一次2个。

可以在O(s)时间内执行的排序不会比较元素,通常它们会计算它们或者它们使用元素值作为索引。

这可能是一个棘手的问题,因为没有指定元素的数量。设s =数组的大小,然后计数排序可以在O(s)时间(而不是O(n)时间)对数组进行排序。