(Caja) Clasificación de cubos y clasificación de bases

Clasificación de cubos (cajas)

La clasificación de depósitos se basa en una lista vinculada. Los depósitos adyacentes y los elementos adyacentes en el depósito están todos conectados por una lista vinculada, que se puede imaginar como una matriz.
Use un ejemplo para ilustrar la clasificación de cubos.

Supongamos que hay una lista vinculada en la que los elementos deben ordenarse. El elemento es ABCDEFGHIJ y su valor es 2454304344 en orden, como A2-> B4-> C5-> D4-> E3-> F0-> G4- > H3-> I4-> J4. Si se ordena según el valor. Primero, definimos 5 cubos bin [5] para contener estos 10 elementos, y luego atravesamos cada elemento por turno, lo colocamos en el cubo correspondiente según su valor, y bin [0] = F, bin [1] = NULL, bin [2] = A, bin [3] = {E, H, J}, bin [4] = {B, D, G, I}, bin [5] = C. Finalmente, reorganizamos los elementos según el orden de bin [0] ~ bin [5] cubos y FAEHJBDGIC. Hasta ahora, la clasificación de cubos está completa.

Al ordenar los depósitos, es necesario eliminar los punteros del nodo final de los nodos originales y luego asignar cada nodo a cada depósito, conectar los nodos en cada cuadro en una lista vinculada y luego reorganizar los nodos de acuerdo con el orden de los depósitos. . Inserte la descripción de la imagen aquí
El siguiente es el código

void binSort(linklist<linknode> &chain, int range) {
    
    

	linklist<linknode> *bin = new linklist<linknode>[range + 1];
	int numberofelement = chain.size();

	for (int i = 0; i < numberofelement; i++) {
    
    
		linknode node = chain.get(0);
		chain.erase(0);
		bin[node.value].insert(0, node);
	}
	for(int i=range,i>=0;i++)
		while (!bin[i].empty())
		{
    
    
			linknode node = bin[i].get(0);
			bin[i].erase(0);
			chain.insert(0, node);
		}
	delete[]bin;
}

Idea de código: el subíndice de la matriz bin es 0 ~ rango, por lo que el tamaño es rango + 1. El primer bucle for recorre cada elemento de la lista vinculada original y lo asigna al depósito correspondiente. Utilice la función get para obtener el primer elemento de la matriz y guárdelo en el nodo del nodo. La función borrar elimina el elemento de la lista vinculada original, y luego usa la función de inserción para Los elementos obtenidos se insertan en cada cubo. Hasta ahora, los elementos están ordenados dentro y entre cubos. El segundo bucle for atraviesa el depósito y los elementos del depósito, y de nuevo utiliza las funciones get, earse e insert para devolver los elementos ordenados a la lista vinculada original.

La implementación específica de la clasificación de cubos como una función miembro de la lista enlazada también se da en el papel negro de la estructura de datos El código también es muy interesante y se puede utilizar como referencia.

template<class T>
void chain<T>::binSort(int range) {
    
    
	chainNode<T> **bottom, **top;//指向指针的指针,第一个指针为桶内指针数组,第二个指针为桶间指针数组
	bottom = new chainNode<T>*[range + 1];
	top = new chainNode<T>*[range + 1];
	//bottom数组必须初始化
	for (int i = 0; i < range; i++) {
    
    
		bottom[i] = NULL;
	}
	//将原链表节点分配到箱中
	for (; firstnode != NULL; firstnode = firstnode->next) {
    
    
		int thebin = firstnode.value;
		if (bottom[thebin] == NUll)//若箱子为空
			bottom[thebin] = top[thebin] = firstnode;
		else {
    
    //箱子不空时仅改变top指针
			top[thebin]->next = firstnode;
			top[thebin] = firstnode;
		}
	}
	//把箱子中的节点收集到有序链表
	chainNode<T>*y = NULL;
	for (int i = 0; i <= range; i++) {
    
    
		if (bottom[i] != NULL) {
    
    
			if (y == NULL)//分配第一个节点
				firstnode = bottom[i];
			else
			//因为桶内已为有序链表,所以只需要改变bottom和top指针使不同桶链表首尾相连
				y->next = bottom[i];
			y = top[i];
		}
	}
}

La complejidad temporal de la clasificación de cubos es O (n + rango). Al observar el código, podemos encontrar que la clasificación de cubos no cambia el orden relativo de los nodos con el mismo valor, por lo que es una clasificación estable.

Orden de base

La clasificación cardinal es una extensión de la clasificación de cubos. A diferencia de la clasificación de cubos, la clasificación cardinal no clasifica directamente los números, sino que descompone los números en números de acuerdo con una determinada base cardinal y luego clasifica los números. Por ejemplo, la base 10 puede descomponer el número decimal 928 en 9, 2 y 8, y la base 60 puede descomponer el número decimal 3725 en 1, 2 y 5. Este es el tipo de radix.

Utilice una pregunta de muestra para ilustrar. Supongamos que se ordenan 10 números enteros del 0 al 999. Si se usa la clasificación de depósitos, rango = 1000. En este momento, se requieren 1000 pasos para la inicialización, 10 pasos para la asignación de nodos y 1000 pasos para la desestructuración, totalizando 2010 pasos .

Se utiliza la ordenación de la base y la base r = 10.
Suponga que los 10 números son respectivamente: 216-> 521-> 425-> 116-> 91-> 515-> 124-> 34-> 96-> 24.
Primero, ordene la lista vinculada según el bit más bajo (un bit ), y el resultado es: 521-> 91-> 124-> 34-> 24-> 425-> 515-> 216-> 116-> 96
Luego, ordena la lista vinculada según el segundo lugar (lugar de las decenas ), el resultado es: 515-> 216 -> 116-> 521-> 124-> 24-> 425-> 34-> 91-> 96 y
finalmente ordena la lista enlazada según el tercer lugar (lugar de las centenas), el resultado es: 24-> 34-> 91-> 96-> 116-> 124-> 216-> 425-> 515-> 521 Hasta
ahora, la clasificación de la base está completa.

La clasificación cardinal se desarrolla sobre la base de la clasificación de cubos. Es una clasificación estable. La complejidad del tiempo es O (cn) = O (n) y c es una constante.

Supongo que te gusta

Origin blog.csdn.net/GGGGG1233/article/details/114748637
Recomendado
Clasificación