Algoritmo de classificação
1. Selecione a classificação
Ideia básica : varrer a sequência do início ao fim, encontrar o menor (máximo) valor do elemento dos elementos a serem classificados em cada passagem, depois trocar o valor com o primeiro elemento e, em seguida, continuar esta seleção e trocar a partir do método dos elementos restantes e, finalmente, obter uma sequência ordenada.
Sequência original: 45 32 65 98 5 42 11 61
- ① Pegue o menor elemento 5 da sequência e troque 5 pelo primeiro elemento da sequência. Neste momento , uma sequência ordenada contendo apenas um elemento é gerada e o comprimento da sequência original é reduzido em 1;
- Resultado: 5 [11 32 42 45 65 98]
- ② Retire o menor elemento 11 da sequência original e troque 11 pelo primeiro elemento da sequência. Neste momento, uma sequência ordenada com apenas dois elementos é gerada e o comprimento da sequência original é reduzido em 1;
- Resultado: 5 11 [32 42 45 65 98]
- Repita os mesmos passos da mesma maneira:
- Resultado: 5 11 32 [42 45 65 98]
- Resultado: 5 11 32 42 [45 65 98]
- Resultado: 5 11 32 42 45 [65 98]
- Resultado: 5 11 32 42 45 65 [98]
- O último elemento deve ser o maior elemento e a classificação produz diretamente uma sequência ordenada;
- Resultado final: 5 11 32 42 45 65 98
Etapas de programação:
- Defina um array e insira os valores para salvar no array;
- Na sequência não ordenada original, encontre o primeiro valor mínimo e o índice;
- Então o índice do valor mínimo é inconsistente com o valor original, e os valores são trocados;
- Repita as etapas ②③;
- Finalmente produza o resultado.
//1.选择排序算法
#include<iostream>
using namespace std;
int a[1000];
int main(){
int n,min,index;
cin>>n;
for(int i=0;i<n;i++){ //1.输入值到数组
cin>>a[i];
}
for(int i=0;i<n;i++){
min = a[i]; // 假设第一个为最小值
index = i; // 锁定最小值索引
for(int j=i+1;j<n;j++){ //逐个跟后面比对
if(min>a[j]){ // 大于最小值,则更新值
min = a[j]; //更新值
index = j; //更新索引
}
}
if(i!=index){ // 当索引不一致,代表最小值变了
swap(a[i],a[index]); //那就交换第一个值与最小值的位置。
}
}
for(int i=0;i<n;i++){ //输出结果。
cout<<a[i]<<" ";
}
return 0;
}
- Estabilidade : Se houver elementos iguais aos dois elementos finais originais na sequência a ser classificada, a estabilidade pode ser destruída. Por exemplo, [2,4,2,1,3], após a classificação, a[2] de [1,2,2,3,4] é inconsistente com o a[2] original e a estabilidade é destruída. Portanto, a classificação por seleção é um algoritmo de classificação instável .
- Complexidade de tempo: A complexidade de tempo da classificação por seleção é O ( ).
- Cenário aplicável: Quando o número de elementos na sequência a ser ordenada é pequeno.
2. Classificação de bolhas
Ideia básica : Compare elementos adjacentes em pares, com números maiores afundando (no final da linha) e números menores subindo (na frente da linha). Desta forma, após uma comparação, o maior (menor) valor será arranjado no final. Todo o processo é como bolhas subindo, por isso é chamado de classificação por bolha.
Sequência original: 45 32 65 98 5 42 11 61
- ① Comparando da frente para trás, com base na comparação de dois números adjacentes, o maior fica atrás e o menor fica na frente;
- A primeira ordenação: 32 45 65 5 42 11 61 98; você pode ver que o maior número chega ao final.
- Então, o número de comparações de ordenação pode ser reduzido em um, porque uma é ordenada;
- Execute a classificação por bolha em não ordenado: 32 45 65 5 42 11 61 ;
- A segunda rodada de classificação: 32 45 5 42 11 61 65 98;
- A terceira rodada de classificação: 32 5 42 11 45 61 65 98;
- A quarta rodada de classificação: 5 32 11 42 45 61 65 98;
- A quinta rodada de classificação: 5 11 32 42 45 61 65 98;
- A sexta rodada de classificação: 5 11 32 42 45 61 65 98;
- Quando se constata que a sexta classificação não mudou, o loop termina e a classificação termina!
Etapas de programação:
- Defina um array e insira os valores para salvar no array;
- Compare dois valores adjacentes e, se o primeiro for maior que o último, troque os dois valores.
- Do primeiro ao último, desta vez a classificação é concluída.
- Repita os passos ②③; até que a comparação não altere o valor, o ciclo termina.
- Finalmente produza o resultado.
//2.冒泡排序
#include<iostream>
using namespace std;
int a[1000];
int main(){
int n;
cin>>n;
for(int i=0;i<n;i++){ //1.输入值到数组
cin>>a[i];
}
for(int i=n-1;i>0;i--){
bool flag = true; //假设排好
for(int j=0;j<i;j++){
if(a[j]>a[j+1]){ //比较相邻的值
swap(a[j],a[j+1]); //交换
flag = false;
}
}
if(flag==true) break; //某一轮排好,没有交换,提前终止。
}
for(int i=0;i<n;i++){ //输出结果
cout<<a[i]<<" ";
}
return 0;
}
- Estabilidade : Na classificação por bolha, valores iguais não são trocados, apenas valores desiguais são trocados, portanto é um método de classificação estável.
- Complexidade de tempo : A complexidade de tempo da classificação por seleção é O ( ).
- Cenários aplicáveis : A classificação por bolhas é adequada para classificar cenários com uma pequena quantidade de dados, porque a implementação da classificação por bolhas é relativamente simples.