Explicação detalhada de dez algoritmos de classificação clássicos (1) classificação por bolha, classificação por seleção, classificação por inserção

Desenvolva um hábito, goste primeiro e depois assista !!!

Seus gostos e atenção me ajudam muito. Se puder, mova os dedos, três conexões com um clique !!!

1. Os critérios de avaliação do algoritmo

Antes de explicar o algoritmo de classificação, vamos primeiro entender de quais ângulos um algoritmo é geralmente julgado.

Qualquer pessoa que conheça um pouco de algoritmo deve saber disso . Esses dois padrões são 时间复杂度e空间复杂度

  • 时间复杂度
    Complexidade de tempo, na verdade é muito fácil de entender. Pelo significado literal, podemos entender bem, ou seja, quanto tempo todo o algoritmo leva para ser executado. Existem mais dois critérios para essa complexidade de tempo. Na verdade, é estrito Dito isso, há três 最好casos 平均, as 最坏circunstâncias , mas geralmente não discutimos a melhor situação, porque isso não faz sentido, então geralmente discutimos o caso médio e o pior caso.

    E, em circunstâncias normais, a complexidade do tempo é o que mais prestamos atenção. Afinal, geralmente nos preocupamos com a rapidez com que o software é executado em nossa vida diária. Seja rápido ou lento, a experiência do usuário será especial. Ruim. Não geralmente digo como essa coisa consome meu espaço de memória.

    Em segundo lugar Outro ponto é 时间复杂度uma manifestação de um 最核心local de algoritmo , afinal, uma complexidade espacial um pouco maior é aceitável, mas se a complexidade de tempo do algoritmo não cair, mesmo que não haja espaço é como o Canadá não pode resolver o problema.

  • 空间复杂度
    A complexidade do espaço é realmente bem compreendida. Refere-se a quanto内存空间 espaço é ocupado durante a execução do algoritmo . Geralmente, nem todos se preocupam particularmente com a complexidade do espaço. Mas aqui está um exemplo de estrutura de dados, todos Você pode compreender imediatamente este conceito.

    Esta estrutura de dados é HashMap, que é uma estrutura de dados que o espaço sacrifícios por vez. Mapa puder直接获取到你想要键的元素 .

    Sabendo que o HashMap é tão poderoso, todos saberão por que as grandes empresas costumam pedir o código-fonte do HashMap quando perguntam sobre o código-fonte da estrutura de dados, pois seu desenho dessa forma é realmente uma fraude.

2. Classificação de algoritmos de classificação

Depois de entender os critérios de avaliação dos algoritmos acima, precisamos ver como esses algoritmos de ordenação são classificados.Existem
basicamente dois métodos de classificação.

  • 排序类型

Insira a descrição da imagem aqui

A comparação aqui é a mesma que todos normalmente entendem, ou seja, é principalmente ordenada por comparação.

  • 是否稳定

Insira a descrição da imagem aqui
A estabilidade aqui precisa ser informada um pouco com todos. A estabilidade aqui se refere a se a posição relativa do mesmo elemento após a classificação é a mesma antes da classificação. Se não houver alteração, o algoritmo é considerado estável. Se você diz isso, talvez não consiga entender muito bem. Aqui ainda usamos a figura a seguir para ajudá-lo a aprofundar sua impressão. Depois de
Insira a descrição da imagem aqui
entender os conceitos acima, poderemos entender melhor alguns dos conceitos propostos quando explicarmos o algoritmo de classificação. Entendido.

3. Dez algoritmos de classificação clássicos - classificação por bolha, classificação por seleção, classificação por inserção

3.1- Classificação de bolhas

算法思想:

Por falar em borbulhamento, a primeira reação de todos pode ser que os peixes dourados cuspindo bolhas na imagem Insira a descrição da imagem aqui
abaixo, podemos ver na tela, as bolhas são maiores à medida que sobem. Esta é a ideia central da classificação por borbulhamento: toda vez que você faz um loop , encontre um valor máximo ou mínimo na sequência ordenada restante e substitua-o no final da sequência ou no início da sequência. Pegue o seguinte exemplo simples, todos podem entender:
Insira a descrição da imagem aqui
isto é um risco A ideia básica da bolha sort. E podemos resumir brevemente as características do tipo de bolha:

  • A posição final de pelo menos um elemento pode ser determinada para cada classificação
  • A classificação BubblingBubble é estável e , somente quando os elementos estão 大小不一样dentro,交换位置 a posição relativa do mesmo elemento permanece inalterada antes e depois da classificação, portanto, a classificação por bolhas é estável.
  • Bubble Sort tem um caso extremo , se temos um conjunto é uma espécie 从大到小de , mas o fim da sequência original é 从小到大o caso , então os pequenos parceiros vai achar que desta vez, nós cada 比较元素之后necessidade destes两个元素进行交换 . Esta é a bolha caso tipo A mais extrema situação.

算法图解:

Insira a descrição da imagem aqui

示例代码:

	public static void main(String[] args) {
    
    
		int []num ={
    
    7,4,9,3,2,1,8,6,5,10};
		long startTime=System.currentTimeMillis();  
		for(int i=0;i<num.length-1;i++) {
    
    
			for(int j=0;j<num.length-1-i;j++) {
    
    
				if(num[j]>num[j+1]) {
    
    
					int temp=num[j+1];
					num[j+1]=num[j];
					num[j]=temp;
				}
			}
			System.out.print("第"+(i+1)+"次排序结果:");
			for(int j=0;j<num.length;j++)
				System.out.print(num[j]+" ");
			System.out.println();
		}
		long endTime=System.currentTimeMillis(); 
		System.out.println("程序运行时间: "+(endTime-startTime)+"ms"); 
	}

Insira a descrição da imagem aqui

复杂度分析:

Depois de compreender a ideia básica da classificação de bolhas, precisamos analisar sua complexidade de tempo e complexidade de espaço.

  • Complexidade do
    tempo Julgamos a complexidade do tempo a partir de dois aspectos

    • Caso
      médio, a complexidade média do caso do nosso algoritmo ocorre principalmente durante o processo de comparação de elementos. Nomeadamente no if(num[j]>num[j+1])processo, que em média é duas vezes o nosso loop for, que calculamos será capaz de chegar a Shi n*(n-1)/2, vamos O maior número de vezes, você pode ver que a complexidade do tempo éO(n*n)
    • O pior caso O
      pior caso é o caso extremo que mencionamos acima. Mas o caso extremo é apenas que a troca de elementos é realizada mais do que nosso caso médio, mas o número de comparações é sempre o mesmo, então a complexidade do tempo também é calculada como issoO(n*n)
  • Complexidade do espaço

Também podemos ver que adicionamos um espaço ao valor em todo o processo de classificação. Esse espaço é definido por nós temp, principalmente para nos ajudar a trocar elementos. Portanto, a complexidade do espaço da classificação por bolhas éO(1)

3.2- Classificação de seleção

算法思想:
A chave para escolher a classificação é escolher. A maneira de escolher é selecionar o menor elemento em cada loop e, em seguida, substituir o menor elemento pelo elemento principal na sequência de classificação. Ainda o mesmo, deixe todos melhorarem através da seguinte figura esta compreensão de um processo de seleção:
Insira a descrição da imagem aqui
esta é a nossa compreensão básica dos conceitos básicos será capaz de escolher onde ordenamos. A necessidade de distinguir entre o tipo superior e tipo bolha é escolher o tipo na posição 比较结束e após 不会直接交换两个元素a posição, 只是记录o menor elemento do sequência atual , depois de encontrar o menor elemento, substitua o menor elemento pelo elemento no início da linha. Depois de
entendê-los, vamos também falar sobre as características da ordenação por seleção:

  • 每次循环Deve ser capaz de determinar um elemento最终位置 , que é o mesmo que classificação por bolha
  • A ordem de seleção também é 不稳定的verdadeira. Você pode não entendê-la aqui, mas ainda a entendemos por meio da seguinte imagem para ocultá-la:
    Insira a descrição da imagem aqui

算法图解:

Insira a descrição da imagem aqui

示例代码:

public static void main(String[] args) {
    
    
		int []num ={
    
    7,4,9,3,2,1,8,6,5,10};
		long startTime=System.currentTimeMillis();  
		for(int i=0;i<num.length-1;i++) {
    
    
			int min=i;
			for(int j=i+1;j<num.length;j++) {
    
    
				if(num[min]>num[j]) {
    
    
					min=j;
				}
			}
			if(i!=min) {
    
    
				int temp=num[i];
				num[i]=num[min];
				num[min]=temp;
			}
			System.out.print("第"+(i+1)+"次排序结果:");
			for(int j=0;j<num.length;j++)
				System.out.print(num[j]+" ");
			System.out.println();
		}
		long endTime=System.currentTimeMillis(); 
		System.out.println("程序运行时间: "+(endTime-startTime)+"ms"); 
	}

Insira a descrição da imagem aqui

复杂度分析:

Depois de compreender a ideia básica de seleção e classificação, precisamos analisar sua complexidade de tempo e complexidade de espaço.

  • Complexidade do
    tempo Julgamos a complexidade do tempo a partir de dois aspectos

    • Caso
      médio, a complexidade média do caso do nosso algoritmo ocorre principalmente durante o processo de comparação de elementos. Nomeadamente no if(num[min]>num[j])processo, que em média é duas vezes o nosso loop for, que calculamos será capaz de chegar a Shi n*(n-1)/2, vamos O maior número de vezes, você pode ver que a complexidade do tempo éO(n*n)
    • O pior caso e o
      pior caso são essencialmente os mesmos que o nosso caso médio, porque independentemente do caso médio ou do pior caso, apenas a posição do menor elemento e a ponta da linha são substituídas no final, e o número de as comparações são iguais, então a complexidade do tempo também éO(n*n)
  • Complexidade do espaço

Também podemos ver que o valor de todo o nosso processo de classificação aumentou em dois espaços. Este espaço é a tempsoma que definimos min, portanto a complexidade do espaço da classificação por seleção também é constante.O(1)

3.3- Classificação de inserção

算法思想:
A ideia algorítmica da classificação por inserção é dividir a sequência inteira em dois segmentos, uma sequência que foi classificada no momento e a outra sequência final ainda não é necessária. Por exemplo, conforme mostrado na seguinte figura: Depois
Insira a descrição da imagem aqui
dividindo essas duas sequências, insira a sequência Cada vez, o elemento principal da sequência a ser classificada é selecionado e inserido na sequência da ordem, começando do final da sequência ordenada, e se for maior que o elemento, o elemento é movido para trás, uma vez que é menor que o elemento O elemento é inserido na posição atual.Esta é a origem do nome de classificação de inserção.

Depois de muito tempo falando, todos podem ainda não entender. Vamos explicar o processo de execução do algoritmo em detalhes por meio da figura a seguir: Depois de
Insira a descrição da imagem aqui
entender a ideia básica do algoritmo de ordenação por inserção, vamos dar uma olhada nas características do o algoritmo:

  • Na verdade, isso não é um recurso , mas depois de comparar com os dois algoritmos acima, você pode descobrir que esse algoritmo não é como o borbulhamento e classificação de seleção acima, cada classificação de ciclo pode determinar a posição final de um elemento. Classificação de inserção de cada classificação de ciclo Após isso é não 能够唯一确定一个元素的最终位置的. Ele só pode ser após cada ciclo 确定一些元素的相对位置.
  • A classificação por inserção e a classificação por bolha têm uma situação de classificação extrema , mas a situação extrema da classificação por bolha é a pior, mas a situação extrema da classificação por inserção é a mais legal. Ou seja, quando a sequência é basicamente ordenada, a classificação por inserção é a mais rápida , e a complexidade de tempo pode ser alcançada O(n)即线性级别. Porque uma vez que a sequência é ordenada, for循环仍然需要执行mas emwhile循环里面就根本不用执行了 , esta é a chave para o nível linear de classificação por inserção. Comparando a classificação de borbulhamento e seleção, todas são 两层for循环realizadas, mas a inserção O segundo ciclo de a classificação é通过while并且有相应的终止条件 que isso torna o desempenho da classificação por inserção relativamente melhor do que as duas anteriores. É claro que é esse 只存在于序列已经基本有序o caso .

算法图解:

Insira a descrição da imagem aqui

示例代码:

public static void main(String[] args) {
    
    
		int []num ={
    
    7,4,9,3,2,1,8,6,5,10};
		long startTime=System.currentTimeMillis();  
		for(int i=1;i<num.length;i++) {
    
    
			int temp=num[i];
			int j=i;
			while(j>0&&temp<num[j-1]) {
    
    
				num[j]=num[j-1];
				j--;
			}
			if(j!=i) {
    
    
				num[j]=temp;
			}
			System.out.print("第"+i+"次排序结果:");
			for(int k=0;k<num.length;k++)
				System.out.print(num[k]+" ");
			System.out.println();
		}
		long endTime=System.currentTimeMillis(); 
		System.out.println("程序运行时间: "+(endTime-startTime)+"ms"); 
	}

Insira a descrição da imagem aqui

复杂度分析:

Depois de compreender a ideia básica do tipo de inserção, precisamos analisar sua complexidade de tempo e complexidade de espaço.

  • Complexidade do
    tempo Julgamos a complexidade do tempo a partir de três aspectos, onde devemos mencionar os casos extremos que mencionamos acima.

    • Melhor caso A
      complexidade do tempo pode atingir o nível linearO(n)
    • Caso
      médio, a complexidade média do caso do nosso algoritmo ocorre principalmente durante o processo de comparação de elementos. Nomeadamente no temp<num[j-1]processo que, em média, um para nós é o número de ciclos e uma camada do loop while, que temos de ser capazes de calcular Out n*(n-1)/2, vamos ao número máximo de vezes, podemos ver que a complexidade do tempo éO(n*n)
    • Pior caso O
      pior caso é essencialmente igual ao nosso caso médio, porque independentemente do caso médio ou do pior caso, o número de comparações é o mesmo, então a complexidade do tempo também éO(n*n)
  • Complexidade do espaço

Também podemos ver que o valor de todo o nosso processo de classificação aumentou em dois espaços. Este espaço é a tempsoma que definimos j, portanto a complexidade do espaço da classificação por seleção também é constante.O(1)

Ok, o compartilhamento de hoje acabou aqui, a palavra de código não é fácil e a originalidade não é fácil.

Se você acha que a escrita da UP está OK ou se acha que o artigo é útil para você, siga o relato oficial da UP. Os novatos UP precisam do seu apoio !!!

Insira a descrição da imagem aqui
Se você não olhar para ele, você parece bem!

Continue assistindo, você parece melhor!

Acho que você gosta

Origin blog.csdn.net/lovely__RR/article/details/112765606
Recomendado
Clasificación