【问题标题】:Sorting an Array with duplicates using Insertion sort使用插入排序对具有重复项的数组进行排序
【发布时间】:2014-06-23 09:42:23
【问题描述】:
package com.sort;

public class ArraySel {

    private Long[] a;
    private int nElems;

    public ArraySel(int max)
    {
        a = new Long[max];
        nElems = 0;
    }

    public void insert(long max)
    {
        a[nElems] = max;
        nElems++;
    }

    public void display()
    {
        for(int j = 0; j < nElems; j++)
        {
            System.out.print(a[j]+ "  ");
        }
        System.out.println();
    }

    public void insertionSort()
    {
        int in , out, flag = 0;
        long temp;
        for(out = 1; out < nElems; out++)
        {
            temp = a[out];
            in = out;
            while(in > 0 && a[in - 1] >= temp )
            {
                if(a[in] == a[in - 1 ])
                {
                    flag++;
                    in--;
                }
                else
                {
                    a[in] = a[in-1];
                    in--;
                }
            }
            a[in] = temp;
        }
    }

}

此代码采用未排序的数组并使用插入排序对其进行排序。 当重复项以未排序的数组排列在一起时,由于多次移位的复杂性提高到O(N^2),我试图通过确保在重复排列在一起的情况下没有项目移动超过一次来实现O(N)

但是当重复项没有排列在一起时,复杂性仍然存在O(N^2)。 在这种情况下我们也可以制作复杂的O(N) 吗?

【问题讨论】:

  • "当重复项在未排序的数组中排列在一起时,由于多次移位,复杂性会提高到 O(N2) ,我试图通过确保没有项目移动超过一次来使其成为 O(N)重复排列在一起的情况。” - 如果输入数组中的元素未排序,则复杂度仍为 O(n^2),无论重复项是否相互跟随。示例 - 5,2,2,1,6 仍然具有复杂度O(n^2)
  • 如果我没记错的话,插入排序时间复杂度总是 O(N^2)
  • @Kartik_Koro - 如果输入数组已排序,则插入排序的最佳情况复杂度变为 O(n)
  • @TheLostMind 我知道,但我们在谈论大 O 表示法,即上限对吗?
  • @Kartik_Koro 是的。排序数组的时间复杂度为 O(n)。这意味着对于排序数组,时间不能超过 (someConstant * n)。我们仍在设置上限。

标签: java sorting insertion-sort code-complexity


【解决方案1】:

复杂性不是由移动的数量决定的,而是由整体操作的数量决定的,在这种情况下也是比较。

插入排序是 O(n^2) 平均复杂度,你不能让它比这更快。仅在最佳情况下以 O(n) 工作,当输入字符串已经排序时 (http://en.wikipedia.org/wiki/Insertion_sort)。

【讨论】:

    【解决方案2】:

    如果没有关于基础数据的更多信息,最佳time complexity 可以通过排序算法实现是O(n log n)n 是元素的数量)。

    诸如插入排序、冒泡排序、选择排序等排序算法,由于它们的双循环,其时间复杂度都为O(n²)。事实上,当获得已经排序的元素列表时,它们有时往往会更好地工作。例如,Insertion sort 的时间复杂度为 O(n),对于完全排序的列表。

    您无法改变这些算法固有的时间复杂度。您唯一能做的就是在输入列表中查找预排序区域时缩短算法。

    【讨论】:

      猜你喜欢
      • 2016-05-05
      • 1970-01-01
      • 1970-01-01
      • 2021-11-04
      • 2021-06-10
      • 1970-01-01
      • 2019-07-15
      • 1970-01-01
      相关资源
      最近更新 更多