对新排序算法的建议

时间:2012-12-15 22:07:56

标签: java sorting

我考虑过新的排序算法,我无法理解明显解决方案中的问题:

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!

2 个答案:

答案 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这个想法并不新鲜,但这可能被视为对它的支持。