箱子排序

概述:先根据被排序对象的属性值的最小值到最大值建立并编号一连串连续有序的箱;然后遍历一遍需要被排序的对象序列,每遍历到一个对象都根据其属性值找到并装入对应编号的箱子直到遍历完毕,这样会使不同属性值的对象在不同序号的箱子中,而相同属性值的对象则在同一编号的箱子中;最后再遍历一遍箱子序列并删掉对象个数为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
	请按任意键继续. . .
*/

箱子排序,布布扣,bubuko.com

时间: 2024-11-08 17:25:54

箱子排序的相关文章

STL练习2 实现插入排序,箱子排序和基数排序

使用list实现了排序的中比较简单的插入排序,箱子排序和基数排序,其中,箱子排序和基树排序只能用于数的排序,所以限制还是蛮大的,箱子排序在实际使用中基本上不使用,箱子排序是基数排序的基础,基数排序有MSD和LSD,MSD也就是从最高位开始向最低位排序,LSD也就是从最低位向最高位排序. 下面附上我的实现代码: //============================================================================ // Name : STLPr

链表的应用——箱子排序和基数排序

单向链表的实现 数据结构它描述的是数据和数据之间的关系.数据结构要三大要素:逻辑结构,描述数据和数据之间的关系,分为线性结构和非线性结构两种,所谓线性结构指的就是这种数据结构描述的数据之间存在这样的关系,除了首元素和微元素,任何元素都存在一个唯一前驱和唯一后继(前驱通俗的说就是这个元素的前一个元素,后继就是这个元素的后一个元素),而非线性结构中的数据元素之间就不存在这种关系,而是用父节点子节点的关系来描述,也就是说前驱后继不存在唯一性:存储结构,所谓存储结构,实际上指的就是怎么它数据之间的逻辑结

HDU 1069--DP--(摞箱子问题)

题意:有n中箱子,可以任意选择它的面作为底面,只有当底面的长和宽严格小于下面的箱子时才能放在下面的箱子上.求用这n种箱子能摞的最高的高度(每种箱子的个数不限). 分析:dp 转移方程:dp[i]=max(dp[j]+a[i],dp[i]),j 从 0 到 i-1,在计算状态转移方程之前先判断箱子的长宽是否满足条件.预先要按照能摞的条件把箱子排序,然后dp:注意每种箱子有三种放置方式,相当于有三种箱子. 1A!很多时候真的只要坚持一下下其实就成功了. 代码: #include<iostream>

【转帖】常见的排序算法

常见的排序算法 总结一下常见的排序算法. 排序分内排序和外排序.内排序:指在排序期间数据对象全部存放在内存的排序.外排序:指在排序期间全部对象个数太多,不能同时存放在内存,必须根据排序过程的要求,不断在内.外存之间移动的排序.内排序的方法有许多种,按所用策略不同,可归纳为五类:插入排序.选择排序.交换排序.归并排序.分配排序和计数排序.插入排序主要包括直接插入排序,折半插入排序和希尔排序两种;选择排序主要包括直接选择排序和堆排序;交换排序主要包括冒泡排序和快速排序;归并排序主要包括二路归并(常用

反序链表

原题: Given a constant K and a singly linked list L, you are supposed to reverse the links of every K elements on L. For example, given L being 1→2→3→4→5→6, if K = 3, then you must output 3→2→1→6→5→4; if K = 4, you must output 4→3→2→1→5→6. Input Specif

把n个球放到m个盒子里

把n个球摆成一排.把m-1个箱子往中间插,巷子左边的球都放进箱子里,没球就表示0个,最后一波放进剩下的箱子里.所以就是n个球和m-1个箱子排序.C(m+n-1) n括号里表示下脚标,括号外表示上角标. [这就是传说的挡板法] N=3,M=2就是C(4) 3=4种. 希望对你有帮助O(∩_∩)O~

线性表的2种实现方式:数组和链表

数组实现方式: 1 #ifndef LINEARLIST_H 2 #define LINEARLIST_H 3 #include<iostream> 4 #include<cstdlib> 5 #include<new> 6 using std::cout; 7 using std::endl; 8 template<class T> 9 class LinearList 10 { 11 public: 12 LinearList(int MaxListSi

链表应用:基数排序

在基数排序( radix sort)中,把数按照某种基数分解为数字,然后对数字进行排序.例3-1 假定对范围在 0 ~ 9 9 9之间的 1 0个整数进行排序.如果使用 r a n g e = 1 0 0 0来调用 B i n S o r t,那么箱子的初始化将需要 1 0 0 0个执行步,节点分配需要 1 0个执行步,从箱子中收集节点需要 1 0 0 0个执行步,总的执行步数为 2 0 1 0.另一种方法是:1) 用 B i n S o r t根据数的最低位数字对 1 0个数进行排序.由于每个

排序算法汇总总结_Java实现

一.插入排序 直接插入排序(Insertion Sort)的算法描述是一种简单直观的排序算法.它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入.插入排序在实现上,通常采用in-place排序(即只需用到O(1)的额外空间的排序),因而在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间. 代码实现: public class Inseretion_Sort {     public static void main(Stri