Algoritmo de clasificación Ejercicio-Insertar clasificación

Introduccion

La ordenación por inserción es un algoritmo de ordenación con una complejidad temporal del nivel O (n 2 ). Entonces, ¿por qué tenemos que aprender algoritmos con complejidad de tiempo O (n 2 )? En algunos casos, la ordenación por inserción es más rápida, por ejemplo, para una matriz casi ordenada o cuando el rango de fluctuación de los valores de los elementos es relativamente pequeño, la ordenación por inserción tiene ventajas naturales. La idea de la ordenación por inserción también se puede aplicar a algoritmos de nivel superior, lo que puede ayudarnos a optimizar aún más la ordenación.

Ideas especificas

  • Establezca un valor de índice i para indexar a la posición del segundo elemento.
  • Establezca otro valor de índice j para que j = i . Luego, deje que el elemento indexado por la j actual se compare con el elemento anterior, y si no cumple con el pedido que necesita ser programado, cámbielo hasta que se cumpla el requisito de que el pedido necesita ser programado.
  • Y así sucesivamente, hasta que se atraviesen todos los elementos siguientes.

Implementación de código

Lo siguiente usa C ++ para implementar un algoritmo básico de clasificación de inserción:

#include<bits/stdc++.h>
using namespace std;

template<class T>
void insertionSort(T arr[], int n) {
    //从第二个元素开始
    for(int i = 1; i < n; i++) {
        for(int j = i; j > 0; j--) {
            //依次与前一个元素比较
            if(arr[j-1] > arr[j]) 
                swap(arr[j-1], arr[j]);
        }
    }
    return;
}

int main(int argc, char const *argv[])
{
    // 测试
    int arr[10] = {10, 9, 8, 7, 6, 5, 4, 3, 2, 1};
    insertionSort(arr, 10);
    for(int i = 0; i < 10; i++) {
        printf("%d ", arr[i]);
    }
    return 0;
}

Optimización

Muchas veces necesitamos optimizar nuestro código, el código anterior también se puede optimizar. Este es un tipo de inserción optimizado que escribí.

#include<bits/stdc++.h>
using namespace std;

template<class T>
void insertionSortAd(T arr[], int n) {
    //从第二个元素开始
    for(int i = 1; i < n; i++) {
        //备份当前值
        T temp = arr[i];
        int j;
        for(j = i; j > 0 && arr[j-1] > temp; j--) {
            //当前面的元素不满足排序要求,覆盖到后面的位置,直到满足排序要求
            arr[j] = arr[j-1];
        }
        //此时 j 所在的位置就是temp该在的位置
        arr[j] = temp;
    }
    return;
}

int main(int argc, char const *argv[])
{
    // 测试
    int arr[10] = {10, 9, 8, 7, 6, 5, 4, 3, 2, 1};
    insertionSortAd(arr, 10);
    for(int i = 0; i < 10; i++) {
        printf("%d ", arr[i]);
    }
    return 0;
}

Se elimina el impacto de los intercambios frecuentes a tiempo.

Pasado

  • Debido al nivel limitado de bloggers, hay omisiones inevitables, ¡los lectores pueden criticar y corregir!
5 artículos originales publicados · Me gusta4 · Visitas 152

Supongo que te gusta

Origin blog.csdn.net/weixin_43587255/article/details/105505666
Recomendado
Clasificación