Implementação (Java) e explicação da classificação por inserção (classificação por inserção direta, classificação por meia inserção, classificação por Hill)

Implementação (Java) e explicação da classificação por inserção (classificação por inserção direta, classificação por meia inserção, classificação por Hill)

1. Visão geral do algoritmo

A ordenação por inserção é um método de ordenação simples e intuitivo, cuja ideia básica é inserir um registro a ser ordenado na subsequência previamente ordenada de acordo com seu tamanho de chave de cada vez até que todos os registros sejam inseridos. Três importantes algoritmos de ordenação podem ser derivados da ideia de ordenação por inserção: ordenação por inserção direta, ordenação por meia inserção e ordenação por Hill

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

	2|58369147
1、将数组分为有序部分和无序部分,如上面,2一个数必然有序,后面一部分无序
2、将后面的数依次插入到前面,即将5拿出来,插入到前面 于是成为。 
	25|8369147 -> 258|369147 -> 2358|69147
3、依次重复上面的1和2,直到所有的全部有序

Complexidade de tempo : O(n^2) no melhor caso,

classificação estável

Aplicável a : Mesas lineares com armazenamento sequencial e armazenamento em cadeia

Código

    //1、直接插入排序
    public static int[] insertDirectSort(int[] arr){
    
    
        int l=arr.length;//数组长度
        int temp;//中间变量
        int j;
        for(int i=1;i<l;i++){
    
    
            //判断i与i-1这两个数的大小
            if(arr[i]<arr[i-1]){
    
    
                temp=arr[i];//i更小,将i存入中间变量
                for(j=i-1;j>=0&&temp<arr[j];j--){
    
    
                    //将大于arr[i]且小于等于arr[i-1]的部分往后移动
                    arr[j+1]=arr[j];
                }
                arr[j+1]=temp;
            }
        }
        return arr;
    }

3. Classificação de meia inserção

A classificação de meia inserção é principalmente para otimizar a parte de pesquisa da classificação de inserção direta, primeiro use a meia pesquisa para encontrar o local a ser inserido e, em seguida, mova-o uniformemente.

Complexidade de tempo : O(n^2)

método de classificação estável

Aplicável a : tabelas lineares apenas para armazenamento sequencial

Código:

    //2、折半插入排序
    public static int[] halfInsertSort(int[] arr){
    
    
        if(arr == null ||arr.length == 0){
    
    //判断数组为空
            return null;
        }
        int n=arr.length;
        int i, j, low, high, mid,tmp;
        for (i = 1; i < n; i++)  //依次将a[2]~a[n]插入到前面已经排好序的列表
        {
    
    
            tmp = arr[i];  //将a[i]暂存到a[0]
            low = 0;
            high = i - 1;
            while (low <= high)
            {
    
    
                mid = low + (high - low) / 2;  //取中间位置(利用low + (high - low) / 2求mid是为了防止整数溢出问题)
                if (arr[mid] > tmp)  //查找左子表
                {
    
    
                    high = mid - 1;
                }
                else  //查找右子表
                {
    
    
                    low = mid + 1;
                }
            }
            for (j = i - 1; j >= high + 1; --j)  //i - 1指待插入元素的前一个元素,即有序列表中所有大于待插入元素的最后一个元素;high + 1指有序列表中所有大于待插入元素的第一个元素
            {
    
    
                arr[j + 1] = arr[j];  //统一后移元素
            }
            arr[high + 1] = tmp;  //插入操作
        }
        return arr;
    }

4. Tipo de colina

​Idéia básica: Hill sorting é agrupar a sequência por um certo incremento do subscrito e usar o algoritmo de classificação por inserção direta para classificar cada grupo; à medida que o incremento diminui gradualmente, cada grupo contém mais e mais palavras-chave, quando o incremento é reduzido a 1, a sequência inteira é exatamente dividida em um grupo e o algoritmo termina.

A classificação por inserção só pode se mover para trás um por um, e a classificação Hill pode se mover pulando etapas, e pequenos números logo chegarão à frente.

Palavras humanas: 1, 1+x, 1+2x, 1+3x ······· um grupo e, em seguida, use a classificação por inserção direta no grupo; o segundo grupo é 2, 2+x,···· ··

​ Após completar uma rodada, reduza o tamanho de x até x=1;

Implementação do código :

    //3、希尔排序
    public static int[] hillSort(int[] arr){
    
    
        //实现增量的变化
        for(int gap = arr.length / 2; gap > 0; gap /= 2) {
    
    
            for(int i = gap; i < arr.length; i++) {
    
    
                for(int j = i - gap; j >= 0; j -= gap) {
    
    
                    if(arr[j] > arr[j + gap]) {
    
    
                        int temp = arr[j];
                        arr[j] = arr[j + gap];
                        arr[j + gap] = temp;
                    }
                }
            }
        }
        return arr;
    }

Acho que você gosta

Origin blog.csdn.net/qq_46138492/article/details/129288565
Recomendado
Clasificación