哪种排序算法堆排序,快速排序& 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包含所有已排序的元素?
对不起,如果这是一个愚蠢的问题,相信我,我看起来尽我所能。
干杯
答案 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]