我考虑过新的排序算法,我无法理解明显解决方案中的问题:
public int[] sort(int[] arr){
//Find the biggest number in the array
int max=1;
for(int i : arr)
if(i>max)
max=i;
//Sorting the figures into big array
int[] LongSorted= new int[max+1];
for(int i=1; i<LongSorted.length; i++)
LongSorted[i]=0;
for(int i : arr)
LongSorted[i]+=i;
//Transfer the sorted figures into the original array
int index=0;
for(int i=0; i<arr.length; i++){
while(LongSorted[index]==0){
index++;
}
arr[i]=index;
if(LongSorted[index]!=(index)){
for(int j=0; j<(LongSorted[index]/index)-1; j++){
i++;
arr[i]=index;
}
}
index++;
}
return arr;
}
基本上,算法使用数字的值作为索引。
如果您想使用此方法,请注意不考虑数字“0”。
您可以按照以下说明进行更正:
的 1 即可。将LongSorted类型更改为“Integer”
的 2 即可。将LongSorted的初始化“for”中的“i”值更改为“1”
3 即可。在最后一个“for”之前的前一行添加以下条件:
if(LongSorted[0]!=null)
arr[0]=0;
4 即可。将最后一个“for”中的“i”值更改为“1” 的 TNX!
答案 0 :(得分:3)
如果这应该完全有效 - 事实并非如此。首先,您多次遍历各种数组。其中一些不是必需的,它们会减慢大量数据的算法。
其次,如果您尝试对以下列表进行排序会发生什么? [1;十亿]
你最终会创建一个大小为10亿+ 1的数组,只是为了对两个数字进行排序。这是40亿字节。
最后,如果有重复的元素会发生什么?
然后正如评论中所指出的那样,负面数字会失败。
如果你完全靠自己提出这个想法,并且对编程很陌生,那么你实际上正在走向正确的道路 - Hashtable。
答案 1 :(得分:0)
我必须来救援:
不可否认,这取决于该算法是否有效,并且它仅涵盖正值&gt; 0。 但这是一个好主意,可能在边境案件中效率很高。
我已经重新编写了一些阅读更友好的内容,仍然使用就地排序:
public static int[] sort(int[] arr) {
// Find the biggest number in the array
int max = 1;
for (int i : arr) {
if (i > max) {
max = i;
}
}
// Sorting the figures into big array
// indexOccurrences[i] is how often the value i occures in arr.
int[] indexOccurrences = new int[max + 1];
for (int i : arr) {
++indexOccurrences[i];
}
// Transfer the sorted figures into the original array
int arrIndex = 0;
for (int j = 1; j < indexOccurrences.length; ++j) {
for (int k = 0; k < indexOccurrences[j]; ++k) {
arr[arrIndex] = j;
++arrIndex;
}
}
assert arrIndex == arr.length;
return arr;
}
public static void main(String[] args) {
int[] values = new int[] { 23, 6, 67, 6, 6, 45, 3 };
values = sort(values);
System.out.println(Arrays.toString(values));
}
[3,6,6,6,23,45,67]
BTW这个想法并不新鲜,但这可能被视为对它的支持。