连续数据流的排序算法

时间:2015-03-30 21:32:48

标签: java algorithm sorting continuous

哪种排序算法堆排序,快速排序& merge-sort可以使用连续的数据流吗?我希望有一个始终排序的列表,以便新值可以立即进入正确位置的列表。我似乎无法找到始终维护已排序列表并拥有连续数据流的细节。

class StreamSorter<A extends Comparable <A>> { 
        // A[] sorted_list;
        // other fields and initialiser: TODO

 public void add_new_element(A x) {

 // add new element to the data received so far and create a sorted list.

  }
 }

如何实现此类,以便每次调用add_new_element时,到目前为止sorted_list包含所有已排序的元素?

对不起,如果这是一个愚蠢的问题,相信我,我看起来尽我所能。

干杯

4 个答案:

答案 0 :(得分:2)

您可以使用TreeSet维护一个有序集合,如果需要,可以使用Collections.synchronizedSortedSet()将其包装在线程安全包装中。

java.util.SortedSet<E> s = java.util.Collections.synchronizedSortedSet( new java.util.TreeSet<E>( new java.util.Comparator<E>(){
    @Override
    public int compare( final E o1, final E o2 ) {
        // Add sorting criteria.
        return 0;
    }
}));

答案 1 :(得分:1)

所以,事情是真的无法真正发挥作用。在任何时候,一个新的最低元素可能会进入并且它必须直接开始,所以你不能开始浏览排序列表,而更多的元素仍在进入。但是堆是排序您正在寻找的内容:您可以为其添加更多元素,并且您可以通过它完成任务,取消您迄今为止看到的最低元素。< / p>

答案 2 :(得分:0)

由于您说I want to have a list that's always sorted,请使用java.util.TreeSet<E>java.util.PriorityQueue<E>TreeSet实现Set接口,因此不允许重复值。

请注意,插入的元素必须具有自然顺序,即实现Comparable<T>,或者您必须提供Comparator<T>

有关已排序数据结构的更多信息,请参阅stackoverflow上的以下question

答案 3 :(得分:0)

如果我理解正确 - 您希望您的元素存储在您的内容集合中,并且在将所有元素添加到集合时,不要在逻辑点对它进行排序。

如果这是正确的理解 - 您正在寻找SortedSet的实现 - 其中一个示例是TreeSet。

请注意,您的元素需要具有可比性。当然,限制在于内存利用率 - 考虑到您正在流式传输它可能会导致相对较大的数据负载。

快速而肮脏的例子,

package com.mytrial;

import java.util.Set;
import java.util.TreeSet;


public class StreamSorterExample {

    private static class MyDataFromStream implements Comparable<MyDataFromStream> {
        int someWeight;

        public MyDataFromStream(int someWeight) {
            this.someWeight = someWeight;
        }

        @Override
        public String toString() {
            return Integer.toString(someWeight);
        }

        @Override
        public int compareTo(MyDataFromStream that) {
            return this.someWeight - that.someWeight;
        }
    };

    public static void main(String[] args) {
        Set<MyDataFromStream> streamedData = new TreeSet<MyDataFromStream>();

        streamedData.add(new MyDataFromStream(10));
        streamedData.add(new MyDataFromStream(3));
        streamedData.add(new MyDataFromStream(5));

        System.out.println(streamedData);

        streamedData.add(new MyDataFromStream(111));
        streamedData.add(new MyDataFromStream(-1));

        System.out.println(streamedData);
    };
};

输出

[3, 5, 10]
[-1, 3, 5, 10, 111]