Java:每次插入元素时如何对数组进行排序

时间:2013-03-30 17:53:13

标签: java arrays sorting

我正在研究java中一个非常简单的类,它允许客户端创建一个整数数组并插入,删除和检查元素是否在这个数组中。 类限制之一是数组应始终按升序排序。 insert(int x)方法每次插入一个元素或者有另一种方法时调用私有排序方法是否有效?

5 个答案:

答案 0 :(得分:1)

如果它必须是一个数组,最好的方法是进行二进制搜索以找到插入点,将较高值的元素向上移动一个位置,然后将新元素放入打开的间隙中

每次插入的数组元素平均移动一半。

如果您可以选择使用不同的数据结构,我建议使用一个TreeMap,其中键是您要插入的Integer,值是该元素插入次数的计数。

答案 1 :(得分:0)

  

每次插入元素时如何对数组进行排序

这样做

 Arrays.sort(array);
  

将指定的整数数组按数字升序排序。排序算法是一个经过调整的快速排序,改编自Jon L. Bentley和M. Douglas McIlroy的“工程排序功能”,软件实践和经验,卷。 23(11)P。1249-1265(1993年11月)。该算法在许多数据集上提供n * log(n)性能,导致其他快速降序降级为二次性能。

阅读java docs here

在运行时增长项而不是使用ArrayList。

在arrayList中这样做。

List<String> unsortList = new ArrayList<String>();
unsortList.add("111");
unsortList.add("333");
unsortList.add("222");

//before sort
System.out.println("ArrayList is unsort");
for(String temp: unsortList){
    System.out.println(temp);
}

//sort the list
Collections.sort(unsortList);

//after sorted
System.out.println("ArrayList is sorted");
for(String temp: unsortList){
    System.out.println(temp);
}

答案 2 :(得分:0)

我建议您使用类似SortedSet< Integer >的排序集合(实现类TreeSet)。

始终排序并删除重复项。

如果您绝对需要int[]java.util.Arrays实用程序包含searchsort

答案 3 :(得分:0)

Java数组具有固定大小,如果您需要执行删除和插入,则可能需要List(ArrayList或LinkedList)

一些替代方案:

  1. 列表;对每个插入进行二进制搜索以找到插入点。

  2. 列表加上地图;你保留在地图中,告诉你列表中每个整数的(第一个)索引。

  3. 列表;插入加Collections.sort(list)

  4. 1不太直白,但最有启发性。 2是最有效的速度,但浪费空间。 3是最直接和务实的。

答案 4 :(得分:0)

阵列可能不是实现你所追求目标的最佳方式,但这取决于你想要从你的课程中得到什么,以及哪些方法很重要是快速的。

要实现你对数组的要求,你能得到的最好结果就是这个(假设数组的大小无限/你只存储了一个最大的整数):

  • 插入:最坏情况:O(n),平均情况:O(n)
  • 删除:最坏情况:O(n),平均情况:O(n)
  • 按索引获取元素:始终:O(1)
  • 检查元素是否存在:最坏情况:O(log n) [二元搜索]

如果这是您追求的效率和行为,那么这就是您问题的答案:

所以你问这是否有效:

  • 将新整数添加到数组的末尾:效率:O(1)
  • 对整个数组进行排序:效率:O(n * log(n))

总效率: O(n * log(n))

有一种更有效的方法,这将涉及到以下几点:

  • 执行二进制搜索以查找数组中需要插入新整数的点。 O(log n)
  • 将所有内容沿1移动到此点的右侧(以便在正确的位置腾出空间)。为O(n)
  • 插入新整数:O(1)

总效率: O(n)

不同的数据结构:

如果这不是您所追求的行为,那么您可以查看一些不同类型的数据结构。例如,基于树的东西,如TreeSet,会产生非常不同的效率:

  • 插入:O(log n)
  • 删除:O(log n)
  • 按索引获取元素:(我不相信?不熟悉此类的完整实现)
  • 检查元素是否存在:O(log n)