zoukankan      html  css  js  c++  java
  • 算法导论------------桶排序算法之研究

    举个来说明桶排序的过程,如果如今有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);
    }


    
    



  • 相关阅读:
    【自用】【做题日记6】CTFHUB-文件上传
    【自用】【做题日记5】CTFHUB-XSS
    【自用】【做题日记4】CTFHUB-SQL注入
    【自用】【做题日记3】CTFHUB-密码口令
    【自用】【做题日记2】CTFHUB-信息泄露
    【自用】【做题日记1】CTFHUB-web前置技能
    前端-常用正则表达式
    ClashX 配置代理白名单
    http 网址 URL 特殊字符转义编码
    axios的post和request请求方法
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/5212715.html
Copyright © 2011-2022 走看看