[C ++] - rápida tipo Detallado

Este blog describe el proceso rápido especie, ya que Internet leer mucho, me siento algunos bloggers son muy engañosas estudiosos, la pintura es un diagrama de burbujas u otro tipo de mapa, seriedad y hablar fila rápido, muy auto-engaño. Esto no quiere decir que, cuando estaba feliz de leer la descripción de texto de otras personas, encontrar el código escrito es un desastre, un desperdicio de mi tiempo de revisión, así, vestidos a sí mismo.

- idea básica rápida:
por el primario de clasificación toda la lista desordenada en dos porciones independientes el uno del otro, una pequeña parte de los datos en el que los datos que la otra parte contiene, y luego continuar con este método eran dos partes de la misma operación hasta que cada parte no puede ser dividida, toda la secuencia de la secuencia ordenada obtenido se convierte.

Por ejemplo la secuencia: 4.938.659.776.132.749

  • Proporcionando dos punteros de baja y alta, la relación de puntos para señalar los encabezados y pies de tabla lista sin ordenar
    Aquí Insertar imagen Descripción

  • En primer lugar, el número de referencia 49, primera de alta puntero de desplazamiento de derecha a izquierda, el primero en encontrar un número menor que 49, es decir, es 27, y la mínima de cambio puntas digitales
    Aquí Insertar imagen Descripción

  • El segundo paso de baja principio, de izquierda a derecha para empezar a buscar cifra mayor que el 49, que es de 65, y luego el punto más alto de la central digital
    Aquí Insertar imagen Descripción

  • La tercera etapa se continúa desde el inicio alta, mirando más pequeño que 49 números, es decir, 13 se señaló entonces y baja intercambio digital
    Aquí Insertar imagen Descripción

  • El cuarto paso de la baja a la derecha para encontrar el recorrido más de 49 grandes números, es decir, 97 es entonces el intercambio puntiaguda y digital de alta
    Aquí Insertar imagen Descripción
    al de baja y alta apuntan a la misma posición, el tipo de viaje se ha completado, 49 como el centro, la lista no ordenada dividida en dos partes, y luego el mismo método, las dos partes de la izquierda y el tipo adecuado.

#include <iostream>
#include <stdlib.h>
#include <stack>
#include <assert.h>
using namespace std;

void QuickSort1(int *a,int left, int right)
{
	if (left < right)
	{
		int low = left;
		int high = right;
		int temp = a[low];
		while (low != high)
		{
			while (low < high&&a[high] >= temp)
				high--;
			if (a[high] < temp)
			{
				int ret = a[high];
				a[high] = a[low];
				a[low] = ret;
			}
			while (low < high&&a[low] <= temp)
				low++;
			if (a[low] > temp)
			{
				int ret = a[high];
				a[high] = a[low];
				a[low] = ret;
			}
		}
		a[low] = temp;
		QuickSort1(a, left, low - 1);
		QuickSort1(a, low + 1, right);
	}
}
void prit(int *a,int n)
{
	for (int i = 0; i < n; i++)
	{
		cout << a[i] << " ";
	}
	cout << endl;
}
int main()
{
	int a[9] = { 49, 38, 65, 97, 76, 13, 27, 49 };
	cout << "原数组是:" << endl;
	prit(a, 8);
	cout << "递归快速排序后:" << endl;
	QuickSort1(a, 0, 7);
	prit(a, 8);
	system("pause");
	return 0;
}
  • Necesario el uso de una pila no recursivo, ideas similares con la recursividad, Direct Attach códigos
#include <iostream>
#include <stdlib.h>
#include <stack>
#include <assert.h>
using namespace std;
int partition(int* a, int left, int right)
{
	double x = a[right];
	int i = left - 1, j = right;
	for (;;)
	{
		while (a[++i] < x) {}
		while (a[--j] > x) { if (j == left) break; }
		if (i < j)
			swap(a[i], a[j]);
		else break;
	}
	swap(a[i], a[right]);
	return i;
}
void Quick_Sort2(int  *arr, int len)
{
	//1.申请一块内存当栈
	//2.进行一次快速排序,找到基准
	//3.把左边 右边的数对进行入栈
	//4.取出数据进行一趟快速排序
	//5.top>0
	int *stack = (int *)malloc(sizeof(int) * len);//定义栈的大小
	assert(stack != NULL);
	int top = 0;
	int low = 0;
	int high = len - 1;
	int par = partition(arr, low, high);
	if (par > low + 1)//左边有两个数据以上数时  入栈
	{
		stack[top++] = low;
		stack[top++] = par - 1;
	}
	if (par < high - 1)//右边左边有两个数据以上数时  入栈
	{
		stack[top++] = par + 1;
		stack[top++] = high;
	}
	while (top > 0)//出栈  栈不空,需要取两个数据出来排序
	{
		high = stack[--top];
		low = stack[--top];
		par = partition(arr, low, high);
		if (par > low + 1)
		{
			stack[top++] = low;
			stack[top++] = par - 1;
		}
		if (par < high - 1)
		{
			stack[top++] = par + 1;
			stack[top++] = high;
		}
	}
	free(stack);
	stack = NULL;
}

void prit(int *a,int n)
{
	for (int i = 0; i < n; i++)
	{
		cout << a[i] << " ";
	}
	cout << endl;
}
int main()
{
	int a[9] = { 49, 38, 65, 97, 76, 13, 27, 49 };
	cout << "原数组是:" << endl;
	prit(a, 8);
	cout << "非递归快速排序后:" << endl;
	Quick_Sort2(a, 8);
	prit(a, 8);
	system("pause");
	return 0;
}
Publicado 33 artículos originales · alabanza ganado 13 · vistas 1059

Supongo que te gusta

Origin blog.csdn.net/Vicky_Cr/article/details/104357358
Recomendado
Clasificación