高速アルゴリズムの反復要素(三スライス)をソーティング

著者:GuangshengZhou
QQ:825672792

問題の説明

ソート処理は、要素のグループの数だけ繰り返されているので最近、クイックソートで、プロジェクトで使用されますが、重複したデータは、アレイに表示されたら、悪いを通じて死者の中に得るための素晴らしい機会にクイックソートスワップに等しいです。今アルゴリズムマイナーの変更、追加は決意条件、カットの即ち第三のに等しいです。

エンコーディング機能

直接コードを以下に示します。

//交换函数
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--;
	}
}

結果は

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]);
  	}
}

リマーク

コード純粋な手で会社のネットワークをプレイするので、プログラムは、学習の交換のために、最善の解決策ではないかもしれません。

リリース元の2件の記事 ウォンの賞賛2 ビュー423

おすすめ

転載: blog.csdn.net/u010158920/article/details/105090779