使用插入排序对具有重复项的数组进行排序

时间:2014-06-23 09:42:24

标签: java sorting insertion-sort code-complexity

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;
        }
    }

}

此代码采用未排序的数组并使用Insertion Sort对其进行排序。 当重复数据以未排序的数组排列在一起时,由于多次移位复杂性会增加到O(N^2),我试图通过确保在重复项排列在一起时没有项目移动多次来使其成为O(N)。 / p>

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

2 个答案:

答案 0 :(得分:2)

复杂性不是由移动次数给出,而是由整体操作次数给出,在这种情况下也是比较。

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

答案 1 :(得分:1)

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

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

您无法改变这些算法的固有时间复杂性。您唯一能做的就是在输入列表中找到预先排序的区域时快速切割算法。