计数排序、基数排序、桶排序

本文详细介绍了三种排序算法:计数排序、基数排序和桶排序。通过实例展示了每种算法的工作原理,并对比了它们在不同场景下的性能表现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include <iostream>
#include <vector>
#include <list>
#include <algorithm>
#include <iterator>

using namespace std;

class MySort {
public:
	MySort(vector<int> v):m_num(v) {}
	virtual ~MySort() = 0{}
	virtual void Sort() = 0;
	void display() {
		copy(m_num.begin(), m_num.end(), ostream_iterator<int>(cout, " "));
		cout << endl;
	}
protected:
	vector<int> m_num;
};

// 计数排序
class CountSort: public MySort {
public:
	CountSort(vector<int> v):MySort(v) {}
	void Sort() {
		int len = m_num.size(), i;
		if (len < 2) return ;
		int iMax = *max_element(m_num.begin(), m_num.end());
		vector<int> count(iMax+1, 0), container(len, 0);
		for (i = 0; i < len; ++ i)
			++ count[m_num[i]];
		for (i = 1; i <= iMax; ++ i)
			count[i] += count[i-1];
		for (i = len-1; i >= 0; -- i) {
			container[count[m_num[i]] - 1] = m_num[i];
			-- count[m_num[i]];
		}
		copy(container.begin(), container.end(), m_num.begin());
	}
};

// 基数排序
class RadixSort: public MySort {
public:
	RadixSort(vector<int> v) : MySort(v) {}

	int getBitCount() {
		int iMax = *max_element(m_num.begin(), m_num.end());
		int d = 0;
		while (iMax) {
			++ d;
			iMax /= 10;
		}
		return d;
	}

	void Sort() {
		int len = m_num.size();
		if (len < 2) return ;
		int d = getBitCount(), i, j;
		int r = 1;
		vector<int> count(10, 0),  container(len, 0);
		for (i = 0; i < d; ++ i) {
			container.assign(len, 0);
			count.assign(10, 0);
			for (j = 0; j < len; ++ j) {
				++ count[(m_num[j]/r) % 10];
			}

			for (j = 1; j < 10; ++ j) {
				count[j] += count[j-1]; 
			}
			
			for (j = len - 1; j >= 0; -- j) {
				int index = (m_num[j]/r) % 10;
				container[count[index] - 1] = m_num[j];
				-- count[index];
			}
			copy(container.begin(), container.end(), m_num.begin());
			r *= 10;
		}
	}
};

// 桶排序
class BucketSort: public MySort {
public:
	BucketSort(vector<int> v):MySort(v){}

	void Sort() {
		int len = m_num.size();
		if (len < 1) return;
		list<int> *lst = new list<int>[len];
		int iMax = *max_element(m_num.begin(), m_num.end());
		int i, index;
		for (i = 0; i < len; ++ i) {
			index = (m_num[i] * len) / (iMax + 1);
			for (list<int>::iterator it = lst[index].begin(); it != lst[index].end(); ++ it) {
				if (*it > m_num[i]) {
					lst[index].insert(it, m_num[i]);
					break;
				}
			}
			if (it == lst[index].end())
				lst[index].insert(it, m_num[i]);
		}

		index = 0;
		for (i = 0; i < len; ++ i) {
			copy(lst[i].begin(), lst[i].end(), m_num.begin() + index);
			index += lst[i].size();
		}
		delete [] lst;
	}
};

int main() {
	int ia[] = {49, 38, 65, 97, 76, 13, 27, 49, 132, 134};
	vector<int> v(ia, ia+10);
	MySort *p;
        // p = new CountSort(v);
        // p = new RadixSort(v);
        p = new BucketSort(v);
	p->Sort();
	p->display();

	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值