Sete tipos de algoritmo de classificação comumente usado

1, bubble sort

O tipo mais simples de algoritmo de classificação. Suponha comprimento n arr matriz, ser dispostos em ordem ascendente. Detalhada do procedimento bolha tipo pode ser descrito como se segue: Em primeiro lugar, o primeiro elemento da matriz, desde o início até ao último elemento na matriz, a matriz de dois elementos adjacentes são comparadas, se um elemento situado na extremidade esquerda dos elementos de matriz da matriz é maior do que a extremidade direita , em seguida, a posição do interruptor dos dois elementos na matriz, o valor máximo de todos os elementos no momento é o mais à direita da matriz de elementos na matriz. Espécie de bolha da matriz seguindo-se os elementos restantes n-1, até que toda a matriz ordenada. complexidade de tempo do algoritmo é O (n ^ 2).

// 冒泡排序
void BubbleSort(int arr[], int length)
{
	for (int i = 0; i < length; i++)
	{
		for (int j = 0; j < length -  i - 1; j++)
		{
			if (arr[j] > arr[j + 1])
			{
				int temp;
				temp = arr[j + 1];
				arr[j + 1] = arr[j];
				arr[j] = temp;
			}
		}
	}
}

2. Selecione Sort

Yan Wei Min Edition "Estruturas de Dados" A idéia básica é selecionar o tipo descrito: em cada passagem n-i + 1 (i = 1,2, ..., n-1) th chave de gravação selecionada como a menor de gravação ordenada sequência i-th gravação. Especificamente, assumindo que o comprimento n da ARR matriz, para ser dispostos em ordem crescente, em seguida, o início do digitais n mínimo min1 é encontrado, se a posição não é o min1 mínimo mais à esquerda de matriz (isto é, não igual min1 arr [ 0]), em seguida, o min1 mínimo e ARR [0] troca, e então encontrar a min2 valor mínimo nas restantes n-1 números, se não for igual ao arr valor mínimo min2 [1], a troca destes dois números, e assim por diante, até que o arr conjunto ordenado. complexidade de tempo do algoritmo é O (n ^ 2).

void  fun(int a[], int n)
{ int p, temp;
  for (int i = 0; i < n-1; i++) 
  {
    p = i;
    for (int j = i; j < n; j++)
      if(a[p] > a[j])
        p = j;
    temp = a[p];
	a[p] = a[i]; 
	a[i] = temp;
  }
}

void main()
{
  int a[N];
  printf("输入数据:\n") ;
  for(int i = 0; i < N; i++) 
	  scanf("%d",&a[i]);
  fun(a,N);
  printf("排序后的数据:\n") ;
  for(int i = 0; i < N; i++) 
	  printf("%5d ",a[i]); 
  printf("\n");
}

3, tipo inserção

 Ordenação por inserção da idéia básica é a seqüência desordenada em uma sequência ordenada. Para, por exemplo, matriz arr = [4,2,8,0,5,1] triagem, 4 pode ser visto como uma sequência ordenada (FIG indicado em azul), o [2,8,0,5 , 1] tratada como uma sequência aleatória. sequência aleatória é menor do que 24, então o encaixe 2 para a esquerda, de 4, desta vez ordenado sequcia torna-se [2,4], numa sequência aleatória [8,0,5,1]. sequência aleatória é maior do que 84, então a inserção 8 para a direita 4, a sequência ordenada torna-se [2,4,8], torna-se uma sequência aleatória [0,5,1]. E assim, em última análise, matriz em ordem ascendente. A complexidade de tempo do algoritmo é O (n ^ 2).

// 插入排序
void InsertSort(int arr[], int length)
{
	for (int i = 1; i < length; i++)
	{
		int j;
		if (arr[i] < arr[i - 1])
		{
			int temp = arr[i];
			for (j = i - 1; j >= 0 && temp < arr[j]; j--)
			{
				arr[j + 1] = arr[j];
			}
			arr[j + 1] = temp;
		}
	}
}

4, triagem Colina

Colina ordenação (Sort da Shell) melhorou em função do algoritmo de ordenação por inserção, a complexidade de tempo do algoritmo é comparado com os anteriores vários algoritmos maior melhoria. A idéia básica do algoritmo é: primeira linha a ser gravada é dividida em várias sequências de inserção classificar sub-sequência, enquanto "substancialmente ordenou" a ser gravado em toda a seqüência, e depois uma vez para todos os registros de inserção direta tipo.

// 插入排序
void ShellSort(int arr[], int length)
{
	int increasement = length;
	int i, j, k;
	do
	{
		// 确定分组的增量
		increasement = increasement / 3 + 1;
		for (i = 0; i < increasement; i++)
		{
			for (j = i + increasement; j < length; j += increasement)
			{
				if (arr[j] < arr[j - increasement])
				{
					int temp = arr[j];
					for (k = j - increasement; k >= 0 && temp < arr[k]; k -= increasement)
					{
						arr[k + increasement] = arr[k];
					}
					arr[k + increasement] = temp;
				}
			}
		}
	} while (increasement > 1);
}

  5, Quick Sort

A idéia básica é a de classificar rapidamente: ordenar por uma viagem para registro de descarga para ser dividido em duas partes independentes, onde a parte de chave da chave registro é menor do que a outra parte do registro, você pode gravar cada uma das duas partes continuam a classificar, alcançou toda a ordem de sequência. Antes de escolher uma ficha (normalmente seleccionar o primeiro registo), a ser classificados de qualquer coluna como um valor de referência, então é menor do que a chave de ficha dos registos são dispostas no seu lugar: o processo quick viagem específica pode ser como descrito a chave de registro de seus grandes registros são colocados por trás da sua posição. Assim, a referência é ao limite, as duas sequências a serem classificados para a coluna.

Especificamente viagem rápida tipo de: proporcionar dois ponteiros apontar para ser baixa e elevada, respectivamente, no início e no final da coluna ordenada, gravar o valor de referência (baseval registos a serem classificados primeira coluna), em seguida, iniciar a posição referida alta a procurar para a frente até encontrar e menos de uma troca baseval gravação e, em seguida, a partir da localização apontada pesquisa lombar até encontrar um registro é maior do que a troca baseval e, repetindo estas duas etapas até que o baixo = alto.

// 快速排序
void QuickSort(int arr[], int start, int end)
{
	if (start >= end)
		return;
	int i = start;
	int j = end;
	// 基准数
	int baseval = arr[start];
	while (i < j)
	{
		// 从右向左找比基准数小的数
		while (i < j && arr[j] >= baseval)
		{
			j--;
		}
		if (i < j)
		{
			arr[i] = arr[j];
			i++;
		}
		// 从左向右找比基准数大的数
		while (i < j && arr[i] < baseval)
		{
			i++;
		}
		if (i < j)
		{
			arr[j] = arr[i];
			j--;
		}
	}
	// 把基准数放到i的位置
	arr[i] = baseval;
	// 递归
	QuickSort(arr, start, i - 1);
	QuickSort(arr, i + 1, end);
}

6, merge sort

meios "Merge" que a combinação de duas ou mais seqüências ordenadas em uma nova lista ordenada. É assumido que a sequência inicial contém de n registos, que pode ser visto como o n ordenada subsequências, cada subsequência de comprimento 1, e depois fundir vinte e dois dar (representa o menor número inteiro igual ou superior a x) de comprimento 2 (ou 1) uma sequência ordenada, e, em seguida fundir de vinte e dois. Repita, até um comprimento de até uma sequência ordenada de n. Este método é chamado seqüenciamento 2-way merge sort.

// 归并排序
void MergeSort(int arr[], int start, int end, int * temp)
{
	if (start >= end)
		return;
	int mid = (start + end) / 2;
	MergeSort(arr, start, mid, temp);
	MergeSort(arr, mid + 1, end, temp);
 
	// 合并两个有序序列
	int length = 0; // 表示辅助空间有多少个元素
	int i_start = start;
	int i_end = mid;
	int j_start = mid + 1;
	int j_end = end;
	while (i_start <= i_end && j_start <= j_end)
	{
		if (arr[i_start] < arr[j_start])
		{
			temp[length] = arr[i_start]; 
			length++;
			i_start++;
		}
		else
		{
			temp[length] = arr[j_start];
			length++;
			j_start++;
		}
	}
	while (i_start <= i_end)
	{
		temp[length] = arr[i_start];
		i_start++;
		length++;
	}
	while (j_start <= j_end)
	{
		temp[length] = arr[j_start];
		length++;
		j_start++;
	}
	// 把辅助空间的数据放到原空间
	for (int i = 0; i < length; i++)
	{
		arr[start + i] = temp[i];
	}
}

7 heap de classificação

/*
	@param arr 待调整的数组
	@param i 待调整的结点的下标
	@param length 数组的长度
*/
void HeapAdjust(int arr[], int i, int length)
{
	// 调整i位置的结点
	// 先保存当前结点的下标
	int max = i;
	// 当前结点左右孩子结点的下标
	int lchild = i * 2 + 1;
	int rchild = i * 2 + 2;
	if (lchild < length && arr[lchild] > arr[max])
	{
		max = lchild;
	}
	if (rchild < length && arr[rchild] > arr[max])
	{
		max = rchild;
	}
	// 若i处的值比其左右孩子结点的值小,就将其和最大值进行交换
	if (max != i)
	{
		int temp;
		temp = arr[i];
		arr[i] = arr[max];
		arr[max] = temp;
		// 递归
		HeapAdjust(arr, max, length);
	}
}
 
// 堆排序
void HeapSort(int arr[], int length)
{
	// 初始化堆
	// length / 2 - 1是二叉树中最后一个非叶子结点的序号
	for (int i = length / 2 - 1; i >= 0; i--)
	{
		HeapAdjust(arr, i, length);
	}
	// 交换堆顶元素和最后一个元素
	for (int i = length - 1; i >= 0; i--)
	{
		int temp;
		temp = arr[i];
		arr[i] = arr[0];
		arr[0] = temp;
		HeapAdjust(arr, 0, i);
	}
}

 

Publicado 407 artigos originais · Louvor obteve 150 · vista 380 000 +

Acho que você gosta

Origin blog.csdn.net/ds1130071727/article/details/103240589
Recomendado
Clasificación