El algoritmo de tres de nivel de entrada de clasificación (comparar, burbujeante, fila rápida) hablar en detalle

Ordenando 1. Comparativo
  Comparativo tipo es más método de clasificación blanco obvio, a partir del primer elemento, y comparando secuencialmente todos los elementos posteriores, más pequeños que el primer elemento, estos dos elementos se pueden intercambiar, y finalmente completaron la primera relación de un primer elemento debe ser mínimo, y luego a partir de la segundo elemento, los elementos y todo posterior comparación, una proporción de acabado, el segundo elemento es una segunda pequeña, empatía, de n-1 End (n es el número de elementos de la matriz) de la rueda, todo matriz ordenada convertido. tipo comparativo es estable , es decir, se encuentra el valor que el cambio no se produce es grande, posición de retención, la complejidad de tiempo es O (n ^ 2), el siguiente código:

#include <iostream>
using namespace std;

void swap(int* a,int* b){//交换 
	int temp=*a;
	*a=*b;
	*b=temp;
}

void Sort(int a[],int len){
	for(int i=0;i<len-1;i++){
		for(int j=i+1;j<len;j++){
			if(a[i]>a[j]){
				swap(a[i],a[j]);
			}
		}
	}
}

int main(){
	int a[10]={8,6,9,7,3,0,2,5,1,4};
	cout << "排序前的数组:" << endl;
	for(int i=0;i<10;i++){
		cout << a[i] << " ";
		if(i==9) cout << endl;
	}
	Sort(a,10);
	cout << "排序后的数组:" << endl;
	for(int i=0;i<10;i++){
		cout << a[i] << " ";
		if(i==9) cout << endl;
	}
	return 0;
}

2. ordenamiento de burbuja
  ordenamiento de burbuja es un algoritmo de ordenación es un clásico, como su nombre lo indica, una especie de burbuja, acaba de tomar las ampollas de agua, como la mayoría se levantó lentamente de debajo de la parte superior. Burbuja tipo es los elementos adyacentes se comparan, por lo que el valor máximo de la superficie final a cambiar lentamente, de modo que la burbuja tipo tiene que ser n-1 veces, es estable , y su complejidad en tiempo es O (N ^ 2) , como sigue:

#include <iostream>
using namespace std;

void swap(int* a,int* b){//交换 
	int temp=*a;
	*a=*b;
	*b=temp;
}

void Sort(int a[],int len){
	for(int i=0;i<len-1;i++){
		for(int j=0;j<len-i-1;j++){
			if(a[j]>a[j+1]){
				swap(a[j],a[j+1]);
			}
		}
	}
}

int main(){
	int a[10]={8,6,9,7,3,0,2,5,1,4};
	cout << "排序前的数组:" << endl;
	for(int i=0;i<10;i++){
		cout << a[i] << " ";
		if(i==9) cout << endl;
	}
	Sort(a,10);
	cout << "排序后的数组:" << endl;
	for(int i=0;i<10;i++){
		cout << a[i] << " ";
		if(i==9) cout << endl;
	}
	return 0;
}

3. rápido Ordenado
  rápido Ordenado refiere fila rápido, es el método más común de clasificar, C ++ biblioteca STL que sort () método es rápido fila (optimizado). Entendemos rápida especie primero hay que entender la división ideológica y vencerás, es acerca de un problema grande y complejo en problemas más pequeños fáciles de resolver, cuando se pone todos los pequeños problemas que resolver, el gran problema será resuelto. Volviendo de descarga tan rápido, la idea de descarga rápida es: encontrar un valor de referencia para estar matriz ordenada, la matriz se ordenará en dos secciones, la primera sección del conjunto es menor que el valor del valor de referencia, el todo es mayor que el valor del segundo párrafo de este valor de referencia . Esta operación se repite a continuación hasta que toda la matriz de estos se han convertido ordenada. Es decir "toda la ordenada, parcial desorden" . En el que la velocidad de referencia relacionado con la eficiencia fila pena seleccionado, rápida drene complejidad media de O (n * log n) cuando la matriz es completamente inversa, rápido degenerado fila en una complejidad O (n-2 ^) . Seleccione respecto al valor de referencia (optimización fila rápida) no ampliar aquí, por lo general, elegir el intervalo elemento más a la izquierda como valor de referencia.
  Así que nuestro problema de cómo el segmento de gama? También es rápida núcleo de drenaje: transversal al barrido, la posición del elemento de conmutación
Por ejemplo: array a clasificar es: 8697302514
En este caso, la bandera valor de referencia = 8, la más a la izquierda subíndice intervalo izquierda = 0, el derecho subíndice más a la derecha = 9; derecho-9 desde el extremo derecho para comenzar a escanear (porque se ha elegido el valor de referencia es el valor del elemento más a la izquierda), 4 < 8, el lado izquierdo debe ser representativo de 4 a 8, se lo cambiamos su posición, la matriz se convierte en: 4 6 9 7 3 0 2 5 1 8, izquierda = 0, derecha = 9 entonces comienza desde la izquierda para barrer izquierda = 0 ,, 4 <= 8, 4 deben ser representativos de la parte izquierda 8, en la posición correcta, entonces la siguiente exploración, 6 <= 8, 6 debe ser representativo de la parte izquierda 8, en la posición correcta, entonces la siguiente exploración, 9 => 8,9. 8 a la derecha debe ser , cambio de j, la matriz se convierte en: 4 6 8 7 3 0 2 5 1 9, izquierda = 2, derecha = 9, a continuación, repetir esta operación (sin intercambio continúa hacia adelante (después) de escaneado de otro cambio en durante el escaneado de inicio) hasta que la izquierda> = derecha, representa la matriz se ha dividido en varios segmentos. La matriz se divide en muchos segmentos: 4617302589, dividido en 46.173.025 a ser ordenados y las dos secciones 9, la operación anterior se repite hasta que todas las secciones están ordenadas ( la posición de cada elemento son adecuadamente), que es el tipo es completa. Tenga en cuenta que: descarga rápida es inestable . Sobre la base de las ideas anteriores, podemos escribir el siguiente código:
  el código contiene notas detalladas de la siguiente manera :()

#include <iostream>
using namespace std;

void swap(int *a,int *b){//交换
	int temp=*a;
	*a=*b;
	*b=temp;
}

int partition(int left,int right,int a[]){//使基准值左边全小于基准值,基准值右边全大于基准值 
	int flag=a[left];//基准值,一般选取区间最左边的元素 
	while(left<right){
		//先从后往前扫,如果比基准值小,将两个值交换 
		while(left<right && a[right]>=flag) right--;
		swap(&a[left],&a[right]);
		//然后从前往后扫,如果比基准值大,将两个值交换 
		while(left<right && a[left]<=flag) left++;
		swap(&a[left],&a[right]);
	}
	return left;//返回基准值的下标,以此为分界线,将区间划分成两个小区间 
}

void quickSort(int start,int end,int a[]){//递归调用(分治思想),直至所有的元素 
	if(start<end){
		int flag=partition(start,end,a);
		quickSort(start,flag-1,a);
		quickSort(flag+1,end,a);
	}
}

int main(){
	int a[10]={8,6,9,7,3,0,2,5,1,4};
	cout << "排序前的数组:" << endl;
	for(int i=0;i<10;i++){
		cout << a[i] << " ";
		if(i==9) cout << endl;
	}
	quickSort(0,9,a);
	cout << "排序后的数组:" << endl;
	for(int i=0;i<10;i++){
		cout << a[i] << " ";
		if(i==9) cout << endl;
	}
	return 0;
}
Publicado 10 artículos originales · ganado elogios 7 · visitas 160

Supongo que te gusta

Origin blog.csdn.net/qq_44204959/article/details/104681475
Recomendado
Clasificación