桶排序C++实现

9.桶排序

  • 桶排序的基本思想
  • 桶排序的算法步骤
  • C++代码实现

桶排序的基本思想

  1. 桶排序是计数排序的扩展,计数排序可以看成每个桶只存储一个元素,而桶排序每个桶存储一定范围的元素。
  2. 桶排序原理:假设输入数据服从均匀分布,将数据分到有限数量的桶里,然后对每个桶分别进行内部排序,最后把全部的数据合并放回原数组中。
  3. 时间、空间复杂度:桶排序的时间复杂度,取决于对各个桶内数据进行排序的时间复杂度(桶内排序),因为其他部分的时间复杂度都是o(n)(桶际排序)。桶划分地越小,各个桶内的数据越少,排序时间也会越少,但相应的空间消耗会增大。
  4. 图示:
    桶排序C++实现_第1张图片

桶排序的算法步骤

  1. 申请n个桶;
  2. 将待排序列中的所有元素按一定规律装入这些桶中;
  3. 使每个桶内部元素有序;
  4. 按照桶际顺序,把所有桶中的元素填充回原序列中。

C++代码实现

#include 
#include 
#include 
#include 
#include 
using namespace std;

/*排序方法类*/
class MySort {
public:
	int n;
	int* A;
	//构造函数 ,便于挑选不同的排序方法
	MySort(int N) {
		this->n = N;
		A = new int[this->n];
		this->SetArray();
	}
	//随机初始化数组 
	void SetArray() {
		srand(time(0));
		for (int i = 0; i < n; i++) {
			A[i] = rand() % 100 + 1;
		}
	}
	//打印数组 
	void Print() {
		for (int i = 0; i < n; i++) {
			cout << A[i] << " ";
		}
		cout << endl;
	}

	//桶排序
	void bucketsort(int* A, int n) {
		vector<vector<int>> bucket(11);   //分配桶(0~9、10~19...)
		for (int i = 0; i < 10; i++) {    //每个桶初始化
			vector<int> x = { };
			bucket[i]=x;
		}
		//把待排序列放入桶中
		for (int i = 0; i < n; i++) {
			bucket[A[i] / 10].push_back(A[i]);
		}
		//把每个桶内的数据填充回到原序列中
		int k = 0;
		for (int i = 0; i <= 10; i++) {
			sort(bucket[i].begin(), bucket[i].end());  //桶内排序
			for (vector<int>::iterator it = bucket[i].begin(); it != bucket[i].end(); it++)
				A[k++] = *it;
		}
	}
	   	 
};

int main() {
	//初始化数组 
	int N;
	cout << "请输入数组长度:";
	cin >> N;
	MySort sort1(N);   //构造排序方法类
	cout << endl;
	cout << "桶排序前:";
	sort1.Print();
	sort1.bucketsort(sort1.A, N);      //桶排序
	cout << "桶排序后:";
	sort1.Print();
	cout << endl;
	return 0;
}

代码验证:

桶排序C++实现_第2张图片

你可能感兴趣的:(排序算法,c++,算法,排序算法)