Algoritmo de classificação --- classificação por inserção (versão java)

Classificação por inserção direta

princípio

O princípio da classificação por inserção é dividir os dados no array em dois intervalos, um intervalo classificado e um intervalo não classificado. O intervalo inicial classificado tem apenas um elemento, que é o primeiro elemento da matriz. A ideia central do algoritmo de inserção é pegar os elementos no intervalo não classificado, encontrar uma posição de inserção adequada no intervalo classificado e inseri-la e garantir que os dados do intervalo classificado estejam sempre em ordem. Repita esse processo até que os elementos no intervalo não classificado estejam vazios e o algoritmo termine.

O processo do algoritmo é mostrado na figura abaixo
Insira a descrição da imagem aqui

O algoritmo é descrito da seguinte maneira:

  • A partir do primeiro elemento, pode-se considerar que o elemento foi classificado;
  • Retire o próximo elemento e faça a varredura de trás para a frente na sequência ordenada de elementos;
  • Se o elemento (classificado) for maior do que o novo elemento, mova o elemento para a próxima posição;
  • Repita a etapa 3 até encontrar a posição em que o elemento classificado é menor ou igual ao novo elemento;
  • Após inserir o novo elemento nesta posição;
  • Repita as etapas 2 ~ 5.

Código

public class InsertSort {
    
    
    public static void main(String[] args) {
    
    
        int[] arr = {
    
    101, 34, 98, 1};
        int insertVal = 0;
        int insertIndex = 0;
        for (int i = 1; i < arr.length; i++) {
    
    
            //取出未排序的下一个元素,及当前参与比较的元素
            insertVal = arr[i];
            //在已经排序的元素序列中从后向前扫描,定义前置索引
            insertIndex = i - 1;

            //insertVal < arr[insertIndex] 待插入的数,还没有找到插入位置
            //需要将 arr[insertIndex] 后移 即 插入的元素一直和它前面的值进行比较,直到找到正确的位置,之后将该位置的值进行插入
            while (insertIndex >= 0 && insertVal < arr[insertIndex]) {
    
    
                arr[insertIndex + 1] = arr[insertIndex];
                insertIndex--;
            }
            //正确的位置不交换元素
            if (insertIndex + 1 !=i) {
    
    
                arr[insertIndex + 1] = insertVal;
            }
            System.out.println(Arrays.toString(arr));
        }
    }
}

1: Qual é a complexidade de tempo da classificação de inserção?

Se os dados a serem classificados já estiverem em ordem, não precisamos mover nenhum dado. Se pesquisarmos a posição de inserção no grupo de dados ordenados do início ao fim, precisaremos apenas comparar um dado de cada vez para determinar a posição de inserção. Portanto, neste caso, a melhor complexidade de tempo é O (n). Observe que aqui é necessário percorrer os dados ordenados do início ao fim. Se a matriz estiver na ordem inversa, cada inserção é equivalente a inserir novos dados na primeira posição da matriz, portanto, uma grande quantidade de dados precisa ser movida, portanto, a complexidade de tempo do pior caso é O (n ^ 2). A complexidade de tempo médio de inserir um dado em uma matriz é O (n ^ 2). Portanto, para a classificação por inserção, cada operação de inserção é equivalente a inserir um dado na matriz e realizar n operações de inserção em um loop , então A complexidade de tempo média é O (n ^ 2).

2: Qual é a complexidade do espaço do tipo de inserção?

É óbvio a partir do processo de implementação que o algoritmo de classificação por inserção não requer espaço de armazenamento adicional para ser executado, então a complexidade do espaço é O (1), ou seja, este é um algoritmo de classificação local.

3: A classificação por inserção é um algoritmo de classificação estável?

Na ordenação por inserção, para elementos com o mesmo valor, podemos escolher inserir os elementos que aparecem depois dos elementos que aparecem antes, de modo que a ordem original possa ser mantida inalterada, de modo que a ordenação por inserção é um algoritmo de ordenação estável.

Acho que você gosta

Origin blog.csdn.net/qq_33626996/article/details/113178437
Recomendado
Clasificación