Três algoritmos de classificação básicos (classificação por bolha, classificação por seleção, classificação por inserção)

Três algoritmos de classificação básicos (bolha, selecionar, inserir)

1. Método de classificação por bolha

Análise de princípio:

Complexidade de tempo: O (n²)

  1. Compare os elementos adjacentes. Se o primeiro for maior que o segundo, troque os dois.
  2. Faça o mesmo trabalho para cada par de elementos adjacentes, desde o primeiro par no início até o último par no final. Neste ponto, o último elemento deve ser o maior número.
  3. Repita as etapas acima para todos os elementos, exceto o último.
  4. Continue a repetir as etapas acima para cada vez menos elementos a cada vez, até que não haja nenhum par de números para comparar.

Código:

Realização completa por meio da circulação de duas camadas

Loop externo: tempos de borbulhamento

Loop interno: tempos de borbulhamento

Nota:

1 Cada vez que mais um dado é organizado, o número de loops internos pode ser reduzido em um, melhorando assim a eficiência.

2 No total, apenas n-1 dados precisam ser classificados, e o restante é o valor mínimo, e não há necessidade de classificar novamente

int main() {
    
    
	// 定义一个未序一维数组
	int arr[10] = {
    
     1,3,6,9,5,8,-1,2,5,7 };

	// 冒泡排序
	// 外层循环: 控制比较的"趟数",每一趟排好一个数据
	for (int i = 9; i > 0; i--)
	{
    
    
		// 内层循环: 控制比较的"次数"
		// 次数受外层循环控制 每趟少比较一次
		for (int j = 0; j < i; j++) {
    
    
			// 比较大小
			// 当前数据比后一个大
			if (arr[j] > arr[j + 1]) {
    
    
				// 交换
				arr[j] = arr[j] ^ arr[j + 1];
				arr[j + 1] = arr[j] ^ arr[j + 1];
				arr[j] = arr[j] ^ arr[j + 1];
			}
		}
	}
    
    // 输出
	for (size_t i = 0; i < 10; i++)
	{
    
    
		printf("%d ",arr[i]);
	}

	return 0;
}

2. Método de seleção e classificação

Análise de princípio:

Complexidade de tempo: O (n ^ 2)

Primeiro, encontre o menor (grande) elemento na sequência não classificada, armazene-o no início da sequência classificada e, em seguida, continue a encontrar o menor (grande) elemento dos elementos não classificados restantes e, em seguida, coloque-o no final da sequência classificada seqüência. E assim por diante, até que todos os elementos sejam classificados.

Código:

Aninhamento de loop de dois níveis, o loop interno encontra o subscrito do valor máximo

Nota:

  1. Ao selecionar o valor máximo, suponha que os primeiros dados sejam os maiores e atualize o subscrito quando encontrar um maior.
  2. O subscrito do valor máximo antes de cada ciclo deve ser reiniciado
#include<stdio.h>

int main() {
    
    
	// 定义一个未序一维数组
	int arr[10] = {
    
     1,3,6,9,5,8,-1,2,5,7 };

	// 选择排序
	int maxIndex = 0;
	int temp;
	for (int i = 9; i > 0; i--)
	{
    
    
		maxIndex = 0;
		for (int j = 0; j <= i; j++) {
    
    
			if (arr[maxIndex] < arr[j]) {
    
    
				maxIndex = j;
			}
		}
		if (maxIndex != i) {
    
    
			temp = arr[maxIndex];
			arr[maxIndex] = arr[i];
			arr[i] = temp;
		}
	}
    
    // 输出
	for (size_t i = 0; i < 10; i++)
	{
    
    
		printf("%d ",arr[i]);
	}

	return 0;
}

Três. Método de classificação por inserção

Análise de princípio:

Complexidade de tempo: O (N ^ (1-2))

Insira o elemento na posição correspondente em uma matriz ordenada

Para matrizes não classificadas, seja em ordem crescente ou decrescente, o elemento frontal (elemento único) pode ser considerado como ordenado

Código:

Trate o elemento da extremidade frontal como uma matriz ordenada e selecione a posição a ser inserida de acordo com as regras de classificação.

Dois níveis de aninhamento de loop.

Loop externo: número de dados

Loop interno: controle o número de comparações

#include<stdio.h>

int main() {
    
    
	// 定义一个未序一维数组
	int arr[10] = {
    
     1,3,6,9,5,8,-1,2,5,7 };

	// 插入排序
	for (int i = 1; i < 10; i++)  // 进行9次排序(第0个元素当做已序)
	{
    
    
		// 内层循环: arr[i]从arr[1]开始比较
		for (int j = i - 1; j >= 0; j--) {
    
    
			// 比较
			if (arr[j + 1] < arr[j]) {
    
    
				// 如果后面的值小于(升序)/大于(降序)前面的值则交换
				arr[j + 1] = arr[j + 1] ^ arr[j];
				arr[j] = arr[j + 1] ^ arr[j];
				arr[j + 1] = arr[j + 1] ^ arr[j];
			}
			else break; // 减少多余的判断
		}
	}
    
    // 输出
	for (size_t i = 0; i < 10; i++)
	{
    
    
		printf("%d ",arr[i]);
	}

	return 0;
}

r[j + 1] ^ arr[j];
			}
			else break; // 减少多余的判断
		}
	}
    
    // 输出
	for (size_t i = 0; i < 10; i++)
	{
    
    
		printf("%d ",arr[i]);
	}

	return 0;
}

Acho que você gosta

Origin blog.csdn.net/zhuiyizhifengfu/article/details/114052848
Recomendado
Clasificación