假设数组中元素的比较采用O(n),当元素从1开始到n时,是否可以对O(n)中的数组进行排序?如果只有从1到n的元素,是否可以对O(n)中的数组进行排序?
我们需要创建一个这样的算法,但不知道它是否可能。我可以想到O(n^2)中的一个。 我不是要求算法,会花费我的时间来创建一个算法,但需要知道它是否可能。
假设数组中元素的比较采用O(n),当元素从1开始到n时,是否可以对O(n)中的数组进行排序?如果只有从1到n的元素,是否可以对O(n)中的数组进行排序?
我们需要创建一个这样的算法,但不知道它是否可能。我可以想到O(n^2)中的一个。 我不是要求算法,会花费我的时间来创建一个算法,但需要知道它是否可能。
这是绝对有可能的话,你只需创建一个计数器阵列和计数我发生时间元素的数量,因为元素范围从至ñ,你知道这个计数器的长度为n。
接下来是生成步骤,在这里简单地生成ķ我元件我如果已经遇到ķ我这样的元件。在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;
}
由于@Aivaen在his/her comment说,这种算法被称为排序计数。
是“桶排序”:尺寸的 申报数组n称之为ARR,其设置为零,
2.对于给定的输入阵列中的每个值:
add one in arr in the index that is equal to the value
声明新的数组出: DECLARE INT K = 0
3.对于i的输入数组
if arr[inputarray[i]>0 do:
1.out[k]= arr[i]
2.arr[inputarray[i] = arr[inputarray[i] -1
3. k=k+1
回了
不清楚“数组中元素的比较需要O(n)”是什么意思。如果一个数组的大小是“s”,那么可能的比较次数是一次取2个数。
可以在O(s)时间执行的排序不会比较元素,通常它们会对它们进行计数,或者它们将元素值用作索引。
这可能是一个技巧性的问题,因为没有指定元素的数量。让s =数组的大小,然后计数排序可以在O(s)时间(不是O(n)时间)对数组进行排序。
重复包含或不包含? –
比较需要O(n)? – gexicide
https://en.wikipedia.org/wiki/Sorting_algorithm查看'Non-comparison sorts' – MBo