Algoritmo Básico C++ ③—— Algoritmo de Classificação (seleção, borbulhando com código completo anexado)

Algoritmo de classificação

1. Selecione a classificação

2. Classificação de bolhas


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:

  1. Defina um array e insira os valores para salvar no array;
  2. Na sequência não ordenada original, encontre o primeiro valor mínimo e o índice;
  3. Então o índice do valor mínimo é inconsistente com o valor original, e os valores são trocados;
  4. Repita as etapas ②③;
  5. 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;
} 

  1.  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 .
  2. Complexidade de tempo: A complexidade de tempo da classificação por seleção é O ( n^{2}).
  3. 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:

  1. Defina um array e insira os valores para salvar no array;
  2. Compare dois valores adjacentes e, se o primeiro for maior que o último, troque os dois valores.
  3. Do primeiro ao último, desta vez a classificação é concluída.
  4. Repita os passos ②③; até que a comparação não altere o valor, o ciclo termina.
  5. 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;
}

  1. 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.
  2. Complexidade de tempo : A complexidade de tempo da classificação por seleção é O ( n^{2}).
  3. 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.

Acho que você gosta

Origin blog.csdn.net/weixin_44775255/article/details/129685211
Recomendado
Clasificación