嗨,我试图根据数组中值的出现次数对数组进行排序。因此,如果我的数组int[] a = new int[]{9,2,4,8,9,4,3,2,8,1,2,7,2,5};
我的数组计数应该是:count [i-1]并基于数组的值我的计数数组看起来像这样:1 4 1 2 1 0 1 2 2
因此count[0] = 1
存储计数为1 count[1] =4
并存储计数为2,count[2] = 1
将计数存储为3,并且count[8] =2
存储9的出现次数。我的计数应该是count[i-1]
,以存储出现次数,并根据我应对数组进行排序的次数。第一个问题,我无法将数组a的出现次数存储到count数组中。并根据出现的次数,我如何去存储数组。根据出现次数对数组进行排序
回答
第一步是通过你的数组,存储每个数字出现的次数。假设数组可包含的元素只能从1
到k
,所以我们需要一个count
阵列可以存储k
元素:
int k = 9;
int[] count = new int[k];
请注意,此数组将在各位置的默认值0
,这需要O(k)
初始化时间和空间做的,所以它是等价的:
int[] count = {0, 0, 0, 0, 0, 0, 0, 0, 0};
因此,最初的计数0
所有元素。
现在我们计算数组中的元素。
例如:
int[] a = new int[]{9,2,4,8,9,4,3,2,8,1,2,7,2,5};
// Go through each element of this array:
int n = a.length
for (int i = 0; i < n; i++) {
// Add 1 to the corresponding position in the count array.
int position = a[i] - 1;
count[position]++;
}
这需要O(n)
时间,并会导致:
count = {1, 4, 1, 2, 1, 0, 1, 2, 2}
我们做到了这一点后,数组实际上是排序。我们可以看到这是真的这样做:
int[] sorted = new int[n];
int h = 0;
for (int i = 0; i < count.length; i++) {
for (int j = 0; j < count[i]; j++) {
// Sum 1 to i to get the original number
sorted[h++] = i + 1;
}
}
System.out.println(Arrays.toString(sorted));
这也需要O(n)
时间和空间,输出:
[1, 2, 2, 2, 2, 3, 4, 4, 5, 7, 8, 8, 9, 9]
所以这个算法总时间和空间复杂度为O(n + k)
,这意味着它项目数量加上最大和最小键值之间的差异线性运行。
这个排序算法可以优化吗? – 2015-04-03 09:11:15
我不这么认为,因为它已经是'O(n + k)'。我更新了答案以表明这一点。 – 2015-04-03 14:51:36
我明白了。非常感谢。 – 2015-04-04 06:31:34
- 1. 根据出现次数对数组进行升序排序
- 2. 根据常见词的出现对csv数据进行排序
- 3. 如何根据出现的UNIX数量对行进行排序?
- 4. 如何根据出现次数对值进行分组
- 5. 如何根据键的出现次数对字典进行“排序”?
- 6. 根据文件中出现的次数对条目进行排序
- 7. 如何根据另一个数组对数组进行排序?
- 8. 根据子数组对数组进行排序count
- 9. 如何根据输入数组对数组进行排序?
- 10. 根据另一个数组对数组进行排序,swift
- 11. 根据输出对HTML数组排序
- 12. 根据票数对人进行排序
- 13. [Java]根据玩家分数对数组进行排序
- 14. 如何根据对象的属性对数组进行排序?
- 15. Javascript:根据输入的数字对数组进行排序。应该出现随机排序
- 16. 根据给定的顺序对数组进行排序
- 17. 根据条件对ArrayList数据进行排序和排序
- 18. 对数组进行排序
- 19. 对数组进行排序
- 20. 根据内部数组上的对象的属性对数组进行排序
- 21. 对数组或数组进行排序?
- 22. 根据月份对数据库结果对象(数组)进行排序
- 23. PHP - 根据另一个阵列对数组进行排序
- 24. 根据其初始键对PHP数组进行排序?
- 25. 根据file.lastModified对文件[]的数组进行排序
- 26. 根据当前时间对php数组进行排序
- 27. Laravel如何根据数组索引对集合进行排序
- 28. 如何根据键值对TCL数组进行排序?
- 29. 根据长度对字符串数组进行排序
- 30. 如何根据notif_date_sort对这个多维数组进行排序?
如果[i]的上限适度小于那么我会建议计数排序 – 2015-04-03 06:15:57
到目前为止,我只能看到要求。你实际执行它有什么困难? – Stultuske 2015-04-03 06:17:57
@ZiadHalabi是的。这可能是解决方案。但我觉得这很复杂。简单的计数就可以了。只是想一想 – 2015-04-03 06:18:16