Classificação de inserção básica Java (classificação por inserção direta, classificação Hill)

1. Conceitos básicos

1. Conceito:

  • A classificação é a operação de organizar uma sequência de registros em ordem crescente ou decrescente de acordo com o tamanho de uma ou algumas palavras-chave. No contexto normal, se você mencionar a classificação, geralmente se refere à ordem crescente (não decrescente)

2. Estabilidade

  • Se dois dados iguais forem classificados, o algoritmo de classificação pode garantir que sua posição relativa não mude, então chamamos o algoritmo de algoritmo de classificação estável
    .
  • Vamos usar um diagrama simples para explicar a todos: os dados fornecidos na figura têm dois 3. Se após a classificação, o 3 preto ainda estiver após o 3 vermelho, então essa classificação é estável, caso contrário, é instável.
    Insira a descrição da imagem aqui

3.Java comum

Insira a descrição da imagem aqui

2. Implementação de código de classificação específico

1. Classificação por inserção direta

  • Estabilidade (estável): A classificação estável não trocará saltos de dados durante o processo de classificação
    . 1. Uma classificação estável pode se tornar uma classificação instável;
    2. Uma classificação instável por si só não pode se tornar estável;

  • Complexidade do espaço: O (1);

  • complexidade de tempo:

    • Melhor caso: quando o array O (n) é ordenado;
    • Pior caso: o pior caso O (n2) quando o array está fora de ordem;
  • Idéia : pegue a ordem crescente como exemplo
    1. Primeiro use i para percorrer a matriz desde o início;
    2. Em seguida, pegue um espaço tmp fora e coloque arr [i] em cada vez;
    3. Em seguida, defina uma variável j, o valor inicial de j i-1;
    4. Compare o tamanho de arr [j] e tmp, se for maior que tmp, coloque arr [j] na posição j + 1;
    5. Ele será organizado até que i atravesse a matriz.

public static void insertsort(int[] arr){
    
    
        for(int i = 1;i < arr.length;i++) {
    
    
            int tmp = arr[i];
            int j = i-1;
            for (;j >= 0;j--){
    
    
                if (arr[j] > tmp) {
    
    
                    arr[j+1] = arr[j];
                }else{
    
    
                    break;
                }
            }
            arr[j+1] = tmp;
        }
    }

2. Hill sort

  • Estabilidade (instável)

1. Uma espécie estável pode se tornar uma espécie instável;

2. Um inerentemente instável não pode se tornar estável;

  • Complexidade do espaço: O (n ^ 1,3) -O (n ^ 1,5);

  • complexidade de tempo:

    • Melhor caso: quando o array O (n) é ordenado;
    • Pior caso: o pior caso O (n ^ 2) quando o array está fora de ordem;
  • Ideia : ordem crescente como exemplo
    1. A classificação por colina é, na verdade, uma otimização da classificação por inserção direta;
    2. O agrupamento de um grupo de dados, como a figura a seguir é dividido em 5 grupos, lacuna == 5, começando da posição 0, adicione lacuna, para determinar os elementos em um grupo, a mesma cor abaixo é um grupo;
    3. Em seguida, cada grupo é classificado por classificação por inserção direta;
    4. Desta vez, a linha é concluída, na próxima vez ela é dividida em 3 grupos , em Chamada de classificação por inserção direta, da próxima vez você pode dividi-lo em 2 grupos ou diretamente em um grupo;
    5. Continue agrupando até que seja dividido em um grupo e classifique a ordem, então a classificação será feita;
    6. Em seguida, todos definitivamente quer saber como escolher gap Você descobriu que o número de grupos é primo, então o número de grupos é selecionado de acordo com o tamanho dos dados. Por exemplo, o seguinte grupo de dados tem 15 elementos, que são divididos em 5, 3 e 1 grupos.
    Insira a descrição da imagem aqui

//希尔排序(优化直接插入排序)
    public static void shellsort(int[] arr){
    
    
        //1.首先获取组数gqp
        int[] drr = {
    
    5,3,1};//定义一个增量数组
        for (int i = 0;i < drr.length;i++){
    
    
            shell(arr,drr[i]);
        }
    }
    //直接插入排序
    public static void shell(int[] arr,int gap) {
    
    
        for(int i = gap;i < arr.length;i++) {
    
    
            int tmp = arr[i];
            int j = i-gap;
            for (;j >= 0;j -= gap){
    
    
                if (arr[j] > tmp) {
    
    
                    arr[j+gap] = arr[j];
                }else{
    
    
                    break;
                }
            }
            arr[j+gap] = tmp;
        }
    }

3. Teste de resultado

public class TestSort {
    
    
//直接插入排序
public static void insertsort(int[] arr){
    
    
        for(int i = 1;i < arr.length;i++) {
    
    
            int tmp = arr[i];
            int j = i-1;
            for (;j >= 0;j--){
    
    
                if (arr[j] > tmp) {
    
    
                    arr[j+1] = arr[j];
                }else{
    
    
                    break;
                }
            }
            arr[j+1] = tmp;
        }
    }
    //希尔排序(优化直接插入排序)将数组进行分组
    public static void shellsort(int[] arr){
    
    
        //1.首先获取组数gqp
        int[] drr = {
    
    5,3,1};//定义一个增量数组
        for (int i = 0;i < drr.length;i++){
    
    
            shell(arr,drr[i]);
        }
    }
    //直接插入排序
    public static void shell(int[] arr,int gap) {
    
    
        for(int i = gap;i < arr.length;i++) {
    
    
            int tmp = arr[i];
            int j = i-gap;
            for (;j >= 0;j -= gap){
    
    
                if (arr[j] > tmp) {
    
    
                    arr[j+gap] = arr[j];
                }else{
    
    
                    break;
                }
            }
            arr[j+gap] = tmp;
        }
    }
//测试main方法
public static void main(String[] args) {
    
    
        //直接插入排序
        int[] arr = {
    
    2,3,5,1,6,4};
        insertsort(arr);
        System.out.print("直接插入排序结果: ");
        for (int i = 0;i < arr.length;i++){
    
    
            System.out.print(arr[i]+" ");
        }
        System.out.println();
        //希尔排序
        int[] arr1 = {
    
    7,4,9,34,0,8,5,22,55,6,12,33,56,89,77};
        shellsort(arr1);
        System.out.print("希尔排序结果: ");
        for (int i = 0;i < arr1.length;i++){
    
    
            System.out.print(arr1[i]+" ");
        }
        System.out.println();
}
}

Acho que você gosta

Origin blog.csdn.net/qq_45665172/article/details/109646040
Recomendado
Clasificación