Encontrar y algoritmo de ordenación

A. Búsqueda

1. búsqueda secuencial (búsqueda lineal) O (n)

##li=[4,5,6,9,3,7],查找9
def search(li, val):
    for i in range(len(li)):
        if li[i]==val:
            return i
    return -1
>>> 3

2. búsqueda binaria de O (log n)

##li = [1,3,6,9,44,67,88](列表要有序),查找9
def bin_search(li, val):
    low = 0
    high = len(li) - 1
    while low <= high:
        mid = (low + high) // 2
        if li[mid] == val:
            print(mid)
            return mid
        elif li[mid] < val:
            low = mid + 1
        else:
            high = mid - 1
    else:
        print("没有这个值")
>>>3

II. Ordena

trío Lowb

1. Ordenar la burbuja

El número de un grupo para ser ordenada en el número total dentro de la gama actual no ha sido ordenados, el orden de arriba hacia abajo de los dos números adyacentes a comparar, de manera que un mayor número de hundimiento, más pequeña para ocupar. A saber: siempre que dos adyacentes relativamente pocos requisitos encontrar su secuenciación y la secuencia opuesta, van a intercambiar.

##最好情况O(n) # 列表有序
##平均情况O(n^2)
##最坏情况O(n^2)
##稳定性:稳定
import random
def bubble_sort(li):
    for i in range(len(li)-1):
        exchange = False
        for j in range(len(li)-i-1):
            if li[j] > li[j+1]:
                li[j], li[j+1] = li[j+1], li[j]
                exchange = True
        if not exchange:
            break
    return li
li = list(range(15))
random.shuffle(li)
print(li)
res = bubble_sort(li)
print(res)

2. Seleccione Ordenar

Para la ordenación de burbuja, hay un lugar se puede optimizar, es decir, durante el viaje, el cambio no es necesario veintidós, puede escribir el valor mínimo, el valor mínimo directamente después de terminar un viaje a la parte delantera del transductor.

##最好情况O(n^2)
##平均情况O(n^2)
##最坏情况O(n^2)
##稳定性:不稳定
import random
def select_sort(li):
    for i in range(len(li)-1):
        min_pos = i
        for j in range(i+1, len(li)):
            if li[j] < li[min_pos]:
                min_pos = j
        li[i], li[min_pos] = li[min_pos], li[i]
    return li

li = list(range(15))
random.shuffle(li)
print(li)
res = select_sort(li)
print(res)

3. Inserción Ordenar

Un registro en la lista ordenada está ordenada, lo que resulta en un nuevo archivo ordenada por número en la Tabla 1. Es decir, el primer registro como la primera secuencia es una secuencia ordenada, y luego inserta una a una de la segunda grabación, hasta que toda la secuencia de ordenado hasta ahora.

##最好情况O(n)
##平均情况O(n^2)
##最坏情况O(n^2)
##稳定性:稳定
import random
def insert_sort(li):
    for i in range(1, len(li)):
        tmp = li[i]
        j = i - 1
        while j >= 0 and li[j] > tmp:
            li[j+1] = li[j]
            j -= 1
        li[j+1] = tmp
    return li

li = list(range(15))
random.shuffle(li)
print(li)
res = insert_sort(li)
print(res)

NB trío

1. Ordenación rápida

Selección de un elemento de referencia, un elemento que es más pequeño que el elemento de referencia en la parte delantera, más grande que el elemento de referencia se coloca detrás del elemento, entonces el valor de referencia es menor que el número de columnas de una serie de sub-elementos y el elemento de referencia es mayor que el método original de columna ordenada hasta que toda la secuencia de ordenado;

##最好情况O(nlogn)
##平均情况O(nlogn)
##最坏情况O(n^2) # 列表有序并倒序(从小到大排序)
##稳定性:不稳定

##方法一
import random
def quicksort(li, left, right):
    if left < right:
        mid = random_partition(li, left, right)
        quicksort(li, left, mid-1)
        quicksort(li, mid+1, right)
    return li
    
#优化快排最坏情况   
def random_partition(li, left, right):
    i = random.randint(left, right)
    li[i], li[left] = li[left], li[i]
    return partition(li, left, right)

def partition(li, left, right):
    tmp = li[left]
    while left < right:
        while left < right and li[right] >= tmp:
            right -= 1
        li[left] = li[right]
        while left < right and li[left] <= tmp:
            left += 1
        li[right] = li[left]
    li[left] = tmp
    return left
li = list(range(15))
random.shuffle(li)
print(li)
res = quicksort(li)
print(res)

##方法二
import random
def quick_sort(li):
    if len(li) < 2:
        return li
    temp = li[0]
    left = [v for v in li[1:] if v <= temp]
    right = [v for v in li[1:] if v > temp]
    left = quick_sort(left)
    right = quick_sort(right)
    return left + [temp] + right
li = list(range(15))
random.shuffle(li)
print(li)
res = quick_sort(li)
print(res)

2. heapsort

heap binario es un árbol binario completo o casi completo árbol binario. satisface pila binaria dos propiedades:
la llave (1) el nodo padre es siempre mayor que o igual a (menor o igual a) una clave para cualquier nodos secundarios;
(2) de la izquierda de cada subárbol de nodo y subárbol derecho es una pila binaria;
gran clave raíz nodo padre cuando la pila es siempre mayor que o igual a cualquier tecla cuando un nodo hijo. Cuando el nodo padre es siempre menor o igual a cualquier tecla clave es un pequeño montón nodo raíz niño;

##最好情况O(nlogn)
##平均情况O(nlogn)
##最坏情况O(nlogn)
##稳定性:不稳定

#大根堆
## O(nlogn)
def sift(li, low, high):
    tmp = li[low]
    i = low
    j = 2 * i + 1
    while j <= high:
        if j + 1 <= high and li[j] < li[j+1]:
            j += 1
        if li[j] > tmp:
            li[i] = li[j]
            i = j
            j = 2 * i + 1
        else:
            break
    li[i] = tmp

def heap_sort(li):
    n = len(li)
    for low in range((n-1)//2, -1, -1):
        sift(li, low, n-1)
    print(li)
    for high in range(n-1, -1, -1):
        li[0], li[high] = li[high], li[0]
        sift(li, 0, high-1)

import random
li = list(range(15))
random.shuffle(li)
print(li)
heap_sort(li)
print(li)

Supongo que te gusta

Origin www.cnblogs.com/chenwenyin/p/12497567.html
Recomendado
Clasificación