human
I am working on the file "Coursera/CICCP2/Curso Introdução à Ciência da Computação com Python - Parte 2.ipynb".
The first task is:
Complexidade Computacional

Análise matemática do desempenho de um algoritmo

Estudo analítico de:

Quantas operações um algoritmo requer para que ele seja executado
Quanto tempo ele vai demorar para ser executado
Quanto de memória ele vai ocupar


Análise da Busca Sequencial
Exemplo: 
Lista telefônica de São Paulo, supondo 2 milhões de telefones fixos.
Supondo que cada iteração do for comparação de string dure 1 milissegundo. 
Pior caso: 2000s = 33,3 minutos
Caso médio (1 milhão): 1000s = 16,6 minutos
Complexidade Computacional da Busca Sequencial

Dada uma lista de tamanho n

A complexidade computacional da busca sequencial é: 

n, no pior caso
n/2, no caso médio


Conclusão

Busca sequencial é boa pois é bem simples

Funciona bem quando a busca é feita num volume pequeno de dados

Sua Complexidade Computacional é muito alta

É muito lenta quando o volume de dados é grande
Portanto, dizemos que é um algoritmo ineficiente

Algoritmo de Ordenação Seleção Direta
Seleção Direta
A cada passo, busca pelo menor elemento do pedaço ainda não ordenado da lista e o coloca no início da lista
No 1º passo, busca o menor elemento de todos e coloca na posição inicial da lista.
No 2º passo, busca o 2º menor elemento da lista e coloca na 2ª posição da lista.
No 3º passo, busca o 3º menor elemento da lista e coloca na 3ª posição da lista.
Repete até terminar a lista
Can you write Python code for it?
assistant
#Here is the Python code you requested.

class Ordenador:
    
    def selecao_direta(self, lista):
        
        fim = len(lista)
        
        for i in range(fim - 1):
            # Inicialmente o menor elemento já visto é o i-ésimo
            posicao_do_minimo = i
            
            for j in range(i + 1, fim):
                if lista[j] < lista[posicao_do_minimo]: # encontrou um elemento menor...
                    posicao_do_minimo = j               # ...substitui.
            
            # Coloca o menor elemento encontrado no início da sub-lista
            # Para isso, troca de lugar os elementos nas posições i e posicao_do_minimo
            
            lista[i], lista[posicao_do_minimo] = lista[posicao_do_minimo], lista[i]

lista = [10, 3, 8, -10, 200, 17, 32]
o = Ordenador()

o.selecao_direta(lista)

lista

lista_nomes = ['maria', 'carlos', 'wilson', 'ana']
o.selecao_direta(lista_nomes)
lista_nomes

import random

print(random.randint(1, 10))

from random import shuffle
x = [i for i in range(100)]
shuffle(x)
x

o.selecao_direta(x)
x

def comprova_ordem(list):
    
    flag = True
    
    for i in range(len(list) - 1):
        if list[i] > list[i + 1]:
            flag = False
    
    return flag

comprova_ordem(x)

list = [1, 2, 3, 4, 5]
list2 = [1, 3, 2, 4, 5]

comprova_ordem(list)

comprova_ordem(list2)

def busca_sequencial(seq, x):
    for i in range(len(seq)):
        if seq[i] == x:
            return True
    return False

def selecao_direta(lista):
    fim = len(lista)
    for i in range(fim-1):
        pos_menor = i
        for j in range(i+1,fim):
            if lista[j] < lista[pos_menor]:
                pos_menor = j
        lista[i],lista[pos_menor] = lista[pos_menor],lista[i]
    return lista

numeros = [55,33,0,900,-432,10,77,2,11]