Inserir classificação direta e ordenar e Hill

#Sort ordenação por inserção direta por algoritmo e ordenação Hill
Hoje, apresentamos a ordenação por inserção direta e o método de ordenação otimizado.

Classificação de inserção direta

A classificação por inserção direta é um dos métodos de classificação mais básicos em que as pessoas podem pensar.Este método de classificação divide a sequência a ser classificada em duas partes, uma parte é classificada e a outra parte não é classificada. No início, a parte classificada contém apenas um elemento e, portanto, é ordenada naturalmente.A cada vez, um elemento da outra parte, ou seja, a sequência a ser classificada, é comparado com a sequência já ordenada em sequência: os elementos que são maiores do que sequencialmente Mova uma posição para a direita até encontrar o elemento menor ou menor na peça classificada, que determina a posição correta do elemento a ser classificado.

O diagrama de demonstração dinâmica é o seguinte: o
Diagrama de classificação por inserção direta
código é implementado da seguinte maneira:

public class InsertSort {

    public static void main(String[] args) {
        Integer[] arr = {8, 6, 1, 3, 9, 7, 2, 5, 4};

        // 外层循环:每次将无序部分第一个元素插入到前面有序部分中正确位置
        for (int i = 1; i < arr.length; i++) {
            int j = i - 1;
            int tmp = arr[i];

            // 内层循环:将外层元素依次与已排序列元素比较
            while (j >= 0 && arr[j] > tmp) {
                // 保证已排序部分有序性,较大元素右移
                arr[j + 1] = arr[j];
                j--;
            }
            // 找到排序位置后插入
            arr[j+1] = tmp;
        }
        
		// test-打印
        for (int i = 0; i < arr.length; i++) {
            System.out.println(arr[i]);
        }
    }

}

A complexidade do tempo ideal é O (n), ou seja, uma sequência já ordenada, apenas cada elemento precisa ser comparado uma vez e a média e o pior caso são O (n ^ 2).

Classificação do shell

A ordenação em colina é baseada na ordenação por inserção direta, que promove as vantagens da ordenação por inserção direta no caso de pequenas seqüências e ordenação básica, e usa a idéia de dividir e conquistar para agrupar as seqüências originais e, em seguida, classificar os elementos no grupo separadamente. Em seguida, reduza o número de grupos e aumente o número de elementos no grupo até que o grupo seja mesclado em um.

O diagrama de demonstração dinâmico é o seguinte: o
Diagrama esquemático da classificação de shell
código é implementado da seguinte forma (o diagrama de demonstração não corresponde ao código):

/**
 * @description: 希尔排序基本实现
 * @author: liyaguang
 * @create: 2018-08-31 13:41
 **/
public class ShellSort {

    public static void main(String[] args) {
        Integer[] arr = {8, 6, 1, 3, 9, 7, 2, 5, 4};

        // 确定分组个数,即确定了每个子序列,也是子序列步长
        for (int i = arr.length / 2; i > 0; i /= 2) {
            // 循环每个子序列,进行排序
            for (int j = 0; j < i; j++) {
                // j、j+i、j+i+i、……、n-i

                // 调用插入排序方法,传入子序列值
                modInsertSort(arr, j, i);
            }
        }

        // 若增量序列中不能保证最后的间距为1,则执行一次扫尾工作,此方法内不需要
        // modInsert(arr, 0, 1);
        for (int i = 0; i < arr.length; i++) {
            System.out.println(arr[i]);
        }

    }

    /**
     * @param arr      待排数组
     * @param startPos 待排子序列起始位置
     * @param delta    步长/分组个数
     */
    public static void modInsertSort(Integer[] arr, int startPos, int delta) {
        for (int i = startPos + delta; i < arr.length - startPos; i += delta) {

            for (int j = i; j > startPos; j -= delta) {
                if (arr[j] < arr[j - delta]) {
                    // swap(arr, y, y -= i);
                    int tmp = arr[j - delta];
                    arr[j - delta] = arr[j];
                    arr[j] = tmp;
                } else {
                    break;
                }
            }
        }
    }
}

A complexidade de tempo da classificação de Hill está intimamente relacionada à estratégia de agrupamento selecionada. Da maneira acima, o "número de agrupamentos dividido por 2 diminuições" é, na verdade, a complexidade de tempo ainda O (n ^ 2). A seleção da sequência incremental apropriada Melhore efetivamente a eficiência da classificação de Hill, alguns podem atingir O (n ^ 3/2), O (n ^ 5/4), e alguns podem até alcançar O (n ^ 7/6), muito perto de O (nlogn )

Sumário

A classificação por inserção direta é uma das maneiras mais prováveis ​​de classificar nossas vidas.Por exemplo, para classificar os resultados de uma classe, usamos um papel em branco o suficiente para registrar primeiro o primeiro aluno na lista de espera. Para os resultados, compare os resultados do segundo aluno com o primeiro para encontrar uma posição adequada e, em seguida, compare os terceiros dados a serem classificados com os dois primeiros para obter o efeito de classificação final.
O uso da ordenação por inserção direta é muito intuitivo e eficaz quando a quantidade de dados na vida é pequena e a sequência a ser ordenada é basicamente ordenada.A complexidade do tempo pode ser controlada em O (n), enquanto a ordenação Hill é baseada na ordenação por inserção direta No jogo completo de suas vantagens, o uso de agrupar, dividir e conquistar o caminho para se tornar cada vez menor, e então gradualmente tirar proveito dos resultados ordenados básicos no processo de fusão.

Referência:
"Estrutura e algoritmo de dados"
Inserção sort-Wikiwand
Shellsort-wikiwand

Bem-vindo a prestar atenção à minha conta pública para saber mais:
Minha conta pública

Publicado 159 artigos originais · elogiou 225 · 210.000 visualizações

Acho que você gosta

Origin blog.csdn.net/lyg673770712/article/details/82263514
Recomendado
Clasificación