Fortuna dejó base de ejemplo del método class2-- 1 tema bandera holandesa

Título de preparación: Dada una matriz de ARR, y una serie num, num menor o igual al número solicitado de la matriz de la izquierda, a la derecha del número es mayor que variedad num. Se requiere un espacio complejidad O adicional (1), la complejidad de tiempo de O (N)

análisis

1. La matriz se divide en num menos y una región de mayor que num. La variable x indica una posición de menos de región. Desde no existe el comienzo de la región menos x = -1, que representa un puntero a la matriz 1 (no existe). A continuación, establezca la posición cur transversal variable como el que comienza cur = 0punto del primer número array.
de desplazamiento 2. comienzo
(1) si cur <= num, entonces el cur elemento actual, y el menos el número de la siguiente zona de cambio, es decir, el número de posiciones de conmutación y cur ++ x posición, cur, X hacia atrás;
(2 ) Si el cur> num, cambio cur;
(3) si cur == arr_length transversales extremos.

Por ejemplo, [4,6,7,3], NUM = 5
1.cur punto 4,4 <5, es decir, la siguiente posición de bit 0 y 4 x 4 (y su propio) de cambio. Después de que el punto x 4, cur ++, punto cur 6;.
2.cur punto 6,5 <6, x sin cambios, CUR ++;
3.cur punto 7,5 <7, x sin cambios, CUR ++;
4.cur 3,3 puntos <5, el intercambio, el intercambio 3 y 6, es decir una x. Después de señalar x 3, cur ++, salir del bucle.
En este caso, x 3 y el punto 4 antes de o menos de área, y después de la x 7,6 es mayor que el área.

Figura ????? no puede ir. . .

código del núcleo

while(cur < arr_length)
	{
		if(arr[cur] <= num)
		{
			swap(arr[cur++],arr[++x]);
		}
		else
		{
			cur++;
		}
	}

El código completo

#include<iostream>
#include<time.h>
#define arr_length 10
using namespace std;

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

int main()
{
	int arr[arr_length];
	int cur = 0;
	int num = 6;
	int x = -1;

	//生成随机长度为arr_length的数组,并输出
	srand((unsigned)time(NULL));
	cout<<"arr = ";
	for(int i = 0;i < arr_length;i++)
	{
		arr[i] = rand()%10;
		cout<<arr[i]<<" ";
	}
	cout<<endl;

	//核心代码
	while(cur < arr_length)
	{
		if(arr[cur] <= num)
		{
			swap(arr[cur++],arr[++x]);
		}
		else
		{
			cur++;
		}
	}
	
	//输出交换后的arr1,arr2
	cout<<"arr1 = ";
	for(int i = 0;i<=x;i++)
	{
		cout<<arr[i]<<" ";
	}
	cout<<endl;
	cout<<"arr2 = ";
	for(int i = x+1;i<arr_length;i++)
	{
		cout<<arr[i]<<" ";
	}
	cout<<endl;
	system("pause");
	return 0;
}

Holandesa problema bandera: Dada una RRA matriz, y una num número, núm favor recuento es menor que en la parte izquierda de la matriz, es igual al número de la matriz num medio, mayor num que el número en el lado derecho de la matriz. Se requiere un espacio complejidad O adicional (1), la complejidad de tiempo de O (N)

análisis

Problemas similares y preliminar
array 1. num dividido en regiones es menor que, igual num y una región de mayor que num. La variable x indica una posición de menos de región, e Y representa un área más grande que el num. Desde el comienzo de menos que y mayor que no existe la zona x = -1,y = length, que representa un puntero a la matriz -1, la longitud (no existe). A continuación, establezca la posición cur transversal variable como el que comienza cur = 0punto del primer número array.
de desplazamiento 2. comienzo
(1) si cur <num, entonces el cur elemento actual, y el siguiente número es menor que el área de la de cambio, es decir, el número de posiciones de conmutación y cur ++ x posición, cur, X hacia atrás;
(2) si cur> num, entonces el cur elemento actual, y más grande que el área de un número de pre -Tema, es decir, el número de posiciones de conmutación y la posición cur -y, y hacia adelante, Cur sin cambios (porque el número de la incertidumbre sobre el cambio)
(3) Si act == num, cur ++.
(4) Si la cur == y final.

código del núcleo

while(cur < y)
	{
		if(arr[cur] < num)
		{
			swap(arr[cur++],arr[++x]);
		}
		else if(arr[cur] == num)
		{
			cur++;
		}
		else
		{
			swap(arr[cur],arr[--y]);
		}
	}

El código completo

#include<iostream>
#include<time.h>
#define arr_length 5
using namespace std;

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

int main()
{
	int arr[arr_length];
	int cur = 0;
	int num = 6;
	int x = -1;
	int y = arr_length;

	//生成随机长度为arr_length的数组,并输出
	srand((unsigned)time(NULL));
	cout<<"arr = ";
	for(int i = 0;i < arr_length;i++)
	{
		arr[i] = rand()%10;
		cout<<arr[i]<<" ";
	}
	cout<<endl;


	//核心代码
	while(cur < y)
	{
		if(arr[cur] < num)
		{
			swap(arr[cur++],arr[++x]);
		}
		else if(arr[cur] == num)
		{
			cur++;
		}
		else
		{
			swap(arr[cur],arr[--y]);
		}
	}


	//输出交换后的arr1,arr2,arr3
	cout<<"arr1 = ";
	for(int i = 0;i<=x;i++)
	{
		cout<<arr[i]<<" ";
	}
	cout<<endl;
	cout<<"arr2 = ";
	for(int i = x+1;i<y;i++)
	{
		cout<<arr[i]<<" ";
	}
	cout<<endl;
	cout<<"arr3 = ";
	for(int i = y;i<arr_length;i++)
	{
		cout<<arr[i]<<" ";
	}
	cout<<endl;


	system("pause");
	return 0;
}
Publicado 51 artículos originales · ganado elogios 1 · vistas 1396

Supongo que te gusta

Origin blog.csdn.net/shi_xiao_xuan/article/details/103490390
Recomendado
Clasificación