Fast algoritmos de ordenación elemento de repetición (de tres slicing)

Autor: GuangshengZhou
QQ: 825672792

Descripción del problema

Utilizado recientemente en un proyecto en una especie rápida, pero una vez que los datos duplicada aparece en la matriz, rápida especie en una gran oportunidad de entrar en los muertos por la mala, debido a que el proceso de selección se repite para una serie de grupos de elementos iguales de intercambio. Ahora las modificaciones algoritmo menores, adiciones iguales a condición de determinación, es decir, un tercio del corte.

función de codificación

Directamente después del código.

//交换函数
void swap(int & nFirst, int & nSecond){
	nFirst = nFirst + nSecond;
	nSecond = nFirst - nSecond ;
	nFirst = nFirst  - nSecond ;
}

// 快速排序
void quicksort(int nArray[], int nLeft, int nRight){
	if(nLeft >= nRight){
		return;
	}
	//临时数据
	int left = nLeft, lcur = nLeft, lcount = 0;
	int right = nRight, rcur = nRight, rcount = 0;
	
	int nValue = nArray[left];

	while(left < right){
		while(left < right &&  nValue <= nArray[right])
		{
			if(nValue == nArray[right]){
				swap(nArray[rcur], nArray[right]);
				rcur--;
				rcount++;
			}
			right--;
		}
		if(left < right){
			nArray[left++] = nArray[right];
		}
		while(left < right && nArray[right] >= nValue){
		 	if(nArray[left] == nValue){
		 		swap(nArray[lcur], nArray[left]);
		 		lcur++;
		 		lcount++;
		 	}
		 	left++;
		} 
		if(left < right){
			nArray[right--] = nArray[left];
		}
	}
	
	nArray[left] = nValue;
	assert(left == right);
	
	//交换右边相等区域
	int index = right + 1;
	while(rcount > 0 && index <= rcur && (nRight - (index-(right + 1))>rcur)){
		swap(nArray[index,], nArray[nRight - (index - (right + 1)]);
		index++;
	}
	//交换左边相等区域
	index = left - 1;
	while(lcount > 0 && indx >= lcur && (nLeft + (left - 1 - index) < lcur)){
		swap(nArray[index,], nArray[nRight - (nLeft + (left - 1 - index)]);
		index--;
	}
}

Los resultados muestran

int main(){
	int array[10] = {30, 20, 30, 50, 60, 30, 30, 40, 40, 35};
	quicksort(array, 0, 10);
	for(int i = 0; i < 10; i++){
  		printf("%d \n", array[i]);
  	}
}

observación

Dado que la red de la empresa con la mano pura código para jugar, el programa puede no ser la mejor solución, sólo para el intercambio de aprendizaje.

Liberadas dos artículos originales · ganado elogios 2 · Vistas 422

Supongo que te gusta

Origin blog.csdn.net/u010158920/article/details/105090779
Recomendado
Clasificación