Algoritmo básico Java de classificação Hill (classificação Shell)

1. Introdução do algoritmo

  1. Divida a matriz de n dados em n / 2 grupos (use n / 2 como o incremento; se for um múltiplo inteiro do incremento, é um grupo). Por exemplo, [117, 101, 106, 155, 112, 60] é dividido em 3 grupos, a saber [117, 155], [101, 112], [106, 60].
  2. Em seguida, insira e classifique cada grupo.
  3. Em seguida, divida os n dados em n / 2 * 2 grupos e classifique por grupo.
  4. Se o incremento for 1 (n dados são um grupo), saia após a classificação.

2. Exemplo de demonstração

Matriz original: [117, 101, 106, 155, 112, 60, 90, 110]

Comprimento: 8

Primeiro agrupamento:Dividido em 4 grupos (8/2)

Grupo 1: [117, 112]
Grupo 2: [101, 60]
Grupo 3: [106, 90]
Grupo 4: [155, 110]

Em seguida, insira classificar (classificar de pequeno a grande) para cada grupo.

Grupo 1: [112, 117]
Grupo 2: [60, 101]
Grupo 3: [90, 106]
Grupo 4: [110, 155]

A matriz original após a classificação é: [112, 60, 90, 110, 117, 101, 106, 155]

Segundo agrupamento: divida em 2 grupos (8/2 * 2)

Grupo 1: [112, 90, 117, 106]
Grupo 2: [60, 110, 101, 155]

Em seguida, insira classificar (classificar de pequeno a grande) para cada grupo.

Grupo 1: [90, 106, 112, 117]
Grupo 2: [60, 101, 110, 155]

A matriz original após a classificação é: [90, 60, 106, 101, 112, 110, 117, 155]

O terceiro agrupamento: dividido em 1 grupo (8/2 * 2 * 2)

Grupo 1: [90,60,106,101,112,110,117,155]

Insira a classificação diretamente e saia do loop após a classificação.

Matriz classificada: [60, 90, 101, 106, 110, 112, 117, 155]

3. Diagrama

Diagrama de classificação

4. Implementação do código (método de troca)

package sort;

import java.util.Arrays;

/**
 * <p>
 *
 * </p>
 *
 * @author: D
 * @since: 2020/9/9
 * @version: 1
 */
public class ShellSortDemo {
    
    
    public static void main(String[] args) {
    
    
        int[] arr = {
    
    117, 101, 106, 155, 112, 60, 90, 110};
        shellSort(arr);
        System.out.println("排序后的结果: " + Arrays.toString(arr));
    }

    private static void shellSort(int[] arr) {
    
    
        int temp;
        for (int len = arr.length / 2; len > 0; len /= 2) {
    
    
            System.out.println("分为:" + len + "组");
            System.out.println("跨度:" + len + "为一组");
            for (int i = 0; i < len; i++) {
    
    
                int k = i;
                System.out.print("第" + (i + 1) + "组 :");
                System.out.print("[");
                while (k < arr.length) {
    
    
                    System.out.print(arr[k] + ",");
                    k += len;
                }
                System.out.println("]");

            }
            System.out.println("----------------------");
            System.out.println("比较次数:" + (arr.length - len));
            for (int i = len; i < arr.length; i++) {
    
    
                //交换法
                System.out.println("交换前 = " + Arrays.toString(arr));
                for (int j = i - len; j >= 0; j -= len) {
    
    
                    System.out.println("比较下标" + j + "的数据:" + arr[j] + ", 和下标" + (j + len) + "的数据:" + arr[j + len] );
                    if (arr[j] > arr[j + len]) {
    
    
                        temp = arr[j];
                        arr[j] = arr[j + len];
                        arr[j + len] = temp;
                        System.out.println("进行交换");
                    }else {
    
    
                        System.out.println("前面已经是更小的了,不交换");
                    }
                }
                System.out.println("交换后 = " + Arrays.toString(arr));
                System.out.println();
            }
        }
    }
}

5. Implementação de código (método de mudança)

package sort;

import java.util.Arrays;

/**
 * <p>
 *
 * </p>
 *
 * @author: D
 * @since: 2020/9/9
 * @version: 1
 */
public class ShellSortDemo {
    
    
    public static void main(String[] args) {
    
    
        int[] arr = {
    
    117, 101, 106, 155, 112, 60, 90, 110};
        System.out.println("原数组: " + Arrays.toString(arr));
        shellSort(arr);
        System.out.println("排序后的结果: " + Arrays.toString(arr));
    }

    private static void shellSort(int[] arr) {
    
    
        int temp;
        int index;
        for (int len = arr.length / 2; len > 0; len /= 2) {
    
    
            System.out.println("分为:" + len + "组");
            System.out.println("跨度:" + len + "为一组");
            for (int i = 0; i < len; i++) {
    
    
                int k = i;
                System.out.print("第" + (i + 1) + "组 :");
                System.out.print("[");
                while (k < arr.length) {
    
    
                    System.out.print(arr[k] + ",");
                    k += len;
                }
                System.out.println("]");

            }
            System.out.println("----------------------");
            for (int i = len; i < arr.length; i++) {
    
    
                System.out.println("移位前 = " + Arrays.toString(arr));
                index = i;
                temp = arr[index];
                System.out.println("比较下标" + (index  - len ) + "的数据:" + arr[index - len] + ", 和下标" + (index) + "的数据:" + arr[index] );
                if (arr[index] < arr[index - len]) {
    
    
                    while (index - len >= 0 && temp < arr[index - len]) {
    
    
                        arr[index] = arr[index - len];
                        index -= len;
                    }
                    arr[index] = temp;
                }
                System.out.println("移位后 = " + Arrays.toString(arr));
                System.out.println();
            }
        }
    }
}

6. Resultado da operação (método de troca)

image-20200909113712543

image-20200909113800975

image-20200909113826814

image-20200909114323165

image-20200909114338985

image-20200909114348254

7. Outra classificação

Classificação por seleção (classificação por seleção) Classificação por
inserção (classificação por inserção) Classificação por
bolha (classificação por bolha)
Classificação rápida (classificação rápida)
Classificação por heap (classificação por heap)

Acho que você gosta

Origin blog.csdn.net/d875708765/article/details/108504259
Recomendado
Clasificación