3.基數排序

#include <vector>
#include <set>
#include <algorithm>

void ArrPrint(std::vector<int> const & arr){

	for (auto i : arr){
		printf("%d ", i);
	}
	printf("\n");
}
//iBase 桶數
void radixsort(std::vector<int> & arr,unsigned int iBase){
	
	if (0 == iBase)
		iBase = 10;

	int iExp = 1;  //將數據分配到桶內的依據位 1  1*iBase  1*iBase*iBase ...
	int iMax = *std::max_element(arr.begin(), arr.end());

	while (iMax / iExp > 0){

		std::vector<int> bucket,temp;
		bucket.resize(iBase);		//桶
		temp.resize(arr.size());	//臨時數組,用於收集桶內數據

		for (auto i : arr){
			bucket[i / iExp%iBase]++;	//計算每一個桶內數據個數
		}
		for (int i = 1; i < bucket.size(); i++)
			bucket[i] += bucket[i - 1];		// 爲了收集桶數據,計算每一個桶以及前面全部桶的數據個數總數
								// 也就知道 arr[i] 在收集桶內數據時,排第幾
		for (int i = arr.size() - 1; i >= 0; i--){
			int iCount = bucket[arr[i] / iExp %iBase];	// 將數據劃分到桶內後,
									//桶 arr[i] / iExp %iBase 本身以及前面一共有多少個數據
			temp[--iCount] = arr[i];			//若是某個桶自己已經前面的桶一共有 
								     //iCount個數字,則從第一個桶開始收集,
									//這個桶的作後一個數字在收集後數組的下標是 iCount-1
			bucket[arr[i] / iExp %iBase] = iCount;		// 桶內數據減一,基於這個緣由, 
									//本循環要從n-1到0迭代,不然收集桶數據的temp下標計算錯誤
		}

		std::copy(temp.begin(), temp.end(), arr.begin()); //將收集的數據重新放入數組,用於下次分配

		printf("\nPASS   : ");
		ArrPrint(arr);
		iExp *= iBase;
	}
}

int main()
{

	std::vector<int> arr = { 521, 310, 72, 373, 15, 546, 385, 856, 187, 147 };
	printf("\nARRAY  : ");
	ArrPrint(arr);
	radixsort(arr,10);  //分紅10個桶進行排序
	printf("\nSORTED  : ");
	ArrPrint(arr);

	return 0;
}

 能夠使用不一樣的 iBase(桶個數)驗證, (二、4 驗證正確。) 算法

 算法分析(桶分配過程與桶數據收集) :http://blog.csdn.net/cjf_iceking/article/details/7943609 數組

相關文章
相關標籤/搜索