假设数组中元素的比较采用O(n),当数组从1到n时,是否可以在O(n)中对数组进行排序?
我们需要创建一个这样的算法,但不知道它是否可能。我可以想到O(n ^ 2)中的一个。 我不是要求算法,会花时间创建一个,但需要知道它是否可行。
答案 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)时间)对数组进行排序。