算法导论------------桶排序算法之研究

举个来说明桶排序的过程,假设现在有A={0.78,0.17,0.39,0.26,0.72,0.94,0.21,0.12,0.23,0.68},桶排序如下所示:

研究过计数排序我们知道了————计数排序是假设输入是由一个小范围内的整数构成,而桶排序则假设输入由一个随机过程产生的,该过程将元素均匀而独立地分布在区间[0,1)上。当桶排序的输入符合均匀分布时,即可以线性期望时间运行。桶排序的思想是:把区间[0,1)划分成n个相同大小的子区间,成为桶(bucket),然后将n个输入数分布到各个桶中去,对各个桶中的数进行排序,然后按照次序把各个桶中的元素列出来即可。

  数中给出了桶排序的伪代码,假设输入是一个含有n个元素的数组A,且每个元素满足0≤A[i]<1,另外需要一个辅助数组B[0....n-1]来存放链表(桶)。伪代码如下所示:

BUCKET_SORT(A)

n = length(A)

for i= 1 to n

do insert A[i] into list B

for i=0 to n-1

do sort list B[i] with insertion sort

concatenate the list B[0]、B[1],,,B[n-1] together in order

现在根据伪代码实现真正的桶排序,这里使用了c++的方法以及STL中的list以及迭代器的功能。以及在桶中使用了插入排序的算法的来对桶中元素进行排序。

<pre name="code" class="cpp">#include <iostream>
#include <vector>
#include <list>
#include <cstdlib>
using namespace std;

void bucket_sort(float *datas, size_t length)
{
	int i, j;
	int index;
	float fvalue;
	size_t lsize;
	list<float> *retlist = new list<float>[length];
	list<float>::iterator iter;
	list<float>::iterator prioiter, enditer;

	for (i = 0; i<length; ++i)
	{
		index = static_cast<int>(datas[i] * 10);
		//insert a new element
		retlist[index].push_back(datas[i]);
		lsize = retlist[index].size();
		if (lsize > 1)
		{
			//get the last element in the list[index]
			iter = --retlist[index].end();
			fvalue = *iter;
			enditer = retlist[index].begin();
			//insert the last element in right position
			while (iter != enditer)
			{
				//get the second last element in the list[index]
				prioiter = --iter;
				//back up iter to the last element in the list[index]
				iter++;
				//compare two float values
				if (*(prioiter)-*iter > 0.000001)
				{
					float temp = *(prioiter);
					*(prioiter) = *iter;
					*iter = temp;
				}
				iter--;
			}
			//the right inserted position
			*(++iter) = fvalue;
		}
	}
	//copy the result to datas
	j = 0;
	for (int i = 0; i<length; i++)
	{
		for (iter = retlist[i].begin(); iter != retlist[i].end(); ++iter)
			datas[j++] = *iter;a
	}
	delete[] retlist;
}

int main()
{
	float datas[10] = { 0.78f, 0.17f, 0.39f, 0.76f, 0.23f, 0.67f, 0.48f, 0.58f, 0.92f, 0.12f };
	bucket_sort(datas, 10);
	cout << "after bucket_sort the result is:" << endl;
	for (int i = 0; i<10; i++)
		cout << datas[i] << " ";
	cout << endl;
	exit(0);
}


时间: 2024-09-28 02:05:16

算法导论------------桶排序算法之研究的相关文章

最快最简单的排序算法:桶排序

在我们生活的这个世界中到处都是被排序过的.站队的时候会按照身高排序,考试的名次需要按照分数排序,网上购物的时候会按照价格排序,电子邮箱中的邮件按照时间排序……总之很多东西都需要排序,可以说排序是无处不在.现在我们举个具体的例子来介绍一下排序算法. 首先出场的我们的主人公小哼,上面这个可爱的娃就是啦.期末考试完了老师要将同学们的分数按照从高到低排序.小哼的班上只有5个同学,这5个同学分别考了5分.3分.5分.2分和8分,哎考的真是惨不忍睹(满分是10分).接下来将分数进行从大到小排序,排序后是8

8-4.桶排序算法详解

1. 桶排序介绍 桶排序(Bucket sort)是一种基于计数的排序算法,工作的原理是将数据分到有限数量的桶子里,然后每个桶再分别排序(有可能再使用别的排序算法或是以递回方式继续使用桶排序进行排序).当要被排序的数据内的数值是均匀分配的时候,桶排序时间复杂度为Θ(n).桶排序不同于快速排序,并不是比较排序,不受到时间复杂度 O(nlogn) 下限的影响. 桶排序按下面4步进行: 1. 设置固定数量的空桶. 2. 把数据放到对应的桶中. 3. 对每个不为空的桶中数据进行排序. 4. 拼接从不为空

桶排序算法

桶排序的基本思想 桶排序利用函数的映射关系,将待排序的数组分成了N个块(桶).实际上,桶排序的f(k)值的计算,其作用就相当于快排中划分,已经把大量数据分割成了基本有序的数据块(桶).然后只需要对每个桶中的少量数据做比较排序(比较排序:即在比较的基础上进行交换,达到排序效果)即可. 假如待排序列K= {49. 38 . 35. 97 . 76. 73 . 27. 49 }.这些数据全部在1-100之间.因此我们定制10个桶,然后确定映射函数f(k)=(k*10)/(k.max).则第一个关键字4

算法快速回顾——排序算法

常用排序算法有以下几种:冒泡排序.插入排序.快速排序.归并排序.堆排序. 本文将对五种常用算法分析并实现. //交换两个元素的值 这里列出几种不同写法 void swap(int *a, int *b) { int c = *a; *a = *b; *b = c; } void swap(int *a,int *b) { *a = (*a)^(*b); *b = (*b)^(*a); *a = (*a)^(*b); } void swap(int *a,int *b) { *a = *a + *

普林斯顿公开课 算法3-7:排序算法复杂度

算法复杂度用来表示在解决某个问题时,算法的性能表现. 复杂度上限,就是某个具体的已经实现的算法能够保证在一定时间内解决问题 复杂度下限,就是通过数学方法证明,所有的算法都必须花费一定的时间才能解决问题 最优化算法,就是可能达到的最小复杂度的算法,通常介于复杂度上限和下限之间 比如排序问题中: 计算模型为决策树 使用比较次数作为开销依据 复杂度上限:使用归并排序可以达到N lgN复杂度 复杂度下限:? 最优化算法:? 决策树举例 有三个不同的元素a b c,通过比较的方式来得出排序结果.那么它的决

Python实现数据结构和算法之桶排序

桶排序 桶排序从 1956 年就开始被使用,该算法的基本思想是由E.J.Issac 和 R.C.Singleton 提出来的. 这个算法就好比有 11 个桶,编号从 0~10.每出现一个数,就在对应编号的桶中放一个小旗子,最后只要数数每个桶中有几个小旗子就 OK 了.例如 2 号桶中有 1 个小旗子,表示2 出现了一次;3 号桶中有 1 个小旗子,表示 3 出现了一次;5 号桶中有 2 个小旗子,表示 5出现了两次;8 号桶中有 1 个小旗子,表示 8 出现了一次. 代码 1 def main(

桶排序算法-python实现

来源: <啊哈算法> 5个数字 5 3 5 2 8需要排序. 用到了桶排序思路 l=[0,0,0,0,0,0,0,0,0,0] p=[5,3,5,2,8] for i in range(10):     for j in p:         if i==j:             l[i]+=1 print l new_l=[] for i in range(10): #核心点在这里     if l[i]!=0:         for j in range(l[i]):        

排序算法 之 桶排序

桶排序是一种效率很高的排序算法,它的时间复杂度为O(n),但桶排序有一定的限制,只有当待排序序列的元素为0到某一确定取值范围的整数时才适用,典型的例子比如成绩的排序等. 算法思想: 设待排序序列的元素取值范围为0到m,则我们新建一个大小为m+1的临时数组并把初始值都设为0,遍历待排序序列,把待排序序列中元素的值作为临时数组的下标,找出临时数组中对应该下标的元素使之+1:然后遍历临时数组,把临时数组中元素大于0的下标作为值按次序依次填入待排序数组,元素的值作为重复填入该下标的次数,遍历完成则排序结

排序算法之——桶排序

这是本人的第一篇随笔,为的是分享学习经验,和大家讨论一些算法,以便取得些许进步,也是对学习的总结. 话不多说,下面我会用图文的方式向各位介绍桶排序. 1.主要思想: 桶排序的大体思路就是先将数组分到有限个桶中,再对每个桶中的数据进行排序,可以说是鸽巢排序的一种归纳结果(对每个桶中数据的排序可以是桶排序的递归,或其他算法,在桶中数据较少的时候用插入排序最为理想). 2.算法效率: 对N个数据进行桶排序的时间复杂度分为两部分: 1.对每一个数据进行映射函数的计算(映射函数确定了数据将被分到哪个桶),