Java 使用插入排序对具有重复项的数组进行排序 package.com.sort; 公共类ArraySel{ 私人长[]a; 内勒姆私人酒店; 公共阵列塞尔(整数最大值) { a=新长[最大值]; nElems=0; } 公共空白插入(最大长度) { a[nElems]=最大值; nElems++; } 公共空间显示() { 对于(int j=0;j=temp) { 如果(a[in]==a[in-1]) { flag++; 在--; } 其他的 { a[in]=a[in-1]; 在--; } } a[in]=温度; } } }

Java 使用插入排序对具有重复项的数组进行排序 package.com.sort; 公共类ArraySel{ 私人长[]a; 内勒姆私人酒店; 公共阵列塞尔(整数最大值) { a=新长[最大值]; nElems=0; } 公共空白插入(最大长度) { a[nElems]=最大值; nElems++; } 公共空间显示() { 对于(int j=0;j=temp) { 如果(a[in]==a[in-1]) { flag++; 在--; } 其他的 { a[in]=a[in-1]; 在--; } } a[in]=温度; } } },java,sorting,insertion-sort,code-complexity,Java,Sorting,Insertion Sort,Code Complexity,这段代码接受未排序的数组,并使用插入排序对其进行排序。 当重复项以未排序的数组排列在一起时,由于多次移位,复杂性会上升到O(N^2),我试图通过确保在重复项排列在一起的情况下,没有项目移动超过一次,从而使其成为O(N) 但是,当重复项没有排列在一起时,复杂性仍然存在O(N^2)。 在这种情况下,我们是否也可以将复杂性设为O(N)?复杂性不是由移动的次数决定的,而是由整体操作的次数决定的,在这种情况下,比较也是如此 插入排序是O(n^2)平均复杂度,你不能让它比这快。只有在最佳情况下,当输入字符串

这段代码接受未排序的数组,并使用插入排序对其进行排序。
当重复项以未排序的数组排列在一起时,由于多次移位,复杂性会上升到
O(N^2)
,我试图通过确保在重复项排列在一起的情况下,没有项目移动超过一次,从而使其成为
O(N)

但是,当重复项没有排列在一起时,复杂性仍然存在
O(N^2)

在这种情况下,我们是否也可以将复杂性设为O(N)?

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


插入排序是O(n^2)平均复杂度,你不能让它比这快。只有在最佳情况下,当输入字符串已被排序()时,In才能在O(n)中工作。

如果没有关于底层数据的进一步信息,使用排序算法可以实现的最佳结果是
O(n log n)
(n是元素数)

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


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

“当重复项在未排序的数组中排列在一起时,由于多次移位,复杂性提高到O(N2),我尝试通过确保在重复项排列在一起时,没有项目移动超过一次,使其成为O(N)。”-如果未对输入数组中的元素进行排序,则复杂性仍将为O(n^2),无论重复项是否紧随其后。。示例-5,2,2,1,6仍然具有O(n^2)的复杂性。如果我不是,则插入排序时间复杂性始终为O(n^2)wrong@Kartik_Koro-如果对输入数组进行排序,那么插入排序的最佳情况复杂性将变为O(n)@TheLostMind我知道,但我们谈论的是大O符号,即右上界?@Kartik_Koro yes。。排序数组的时间复杂度为O(n)。这意味着对于排序数组,时间不能超过(someConstant*n)。我们仍在设定上限。
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;
        }
    }

}