首页 > 代码库 > 箱子排序

箱子排序

     概述:先根据被排序对象的属性值的最小值到最大值建立并编号一连串连续有序的箱;然后遍历一遍需要被排序的对象序列,每遍历到一个对象都根据其属性值找到并装入对应编号的箱子直到遍历完毕,这样会使不同属性值的对象在不同序号的箱子中,而相同属性值的对象则在同一编号的箱子中;最后再遍历一遍箱子序列并删掉对象个数为0的空箱子,则剩余的箱子序列即为有序的对象序列。

    建议数据结构:如果有需要对于箱子序列最好使用链表类的容器,这样会更加容易删除对象个数为0的空箱子。

     示例:

    问题:对下面的序列进行排序:

        {7,11,12,3,4,9,77,2,33,4,7,10,88,101,78,13,34,25,58,8,9}

     示例实现代码及结果如下:

 该算法相当于是用执行内存换取执行时间,被排序对象的属性值跨度不大,即删除空箱子前的箱子序列不大时可以考虑该算法。

    时间复杂度为(n);

#include<iostream>
#include<algorithm>
using namespace std;

int main()
{
	int data[] = {7,11,12,3,4,9,77,2,33,4,7,10,88,101,78,13,34,25,58,8,9};
	//找到最大值和最小值
	int max = *(max_element(data,data+sizeof(data)/sizeof(data[0])));
	int min = *(min_element(data,data+sizeof(data)/sizeof(data[0])));
	//建立连续有序的箱子序列
	int * Order = new int[max-min+1];
	for (int i = 0; i < max-min+1; i++)
	{
		Order[i] = 0;
	}

	//将元素对号入座放入箱子
	for (int i = 0; i < sizeof(data)/sizeof(data[0]); i++)
	{
		Order[data[i]-min]++;
	}

	//略过空箱子将有序的元素输出
	for (int i = 0; i < max-min+1; i++)
	{
		if(0==Order[i]) continue;
		for (int j = 0; j < Order[i]; j++)
		{
			cout<<i+min<<" ";
		}
	}
	cout<<endl;
}
/*
	运行结果
	2 3 4 4 7 7 8 9 9 10 11 12 13 25 33 34 58 77 78 88 101
	请按任意键继续. . .
*/