鸽巢排序算法描述和代码举例

//鸽巢排序
//适用条件:所有取值的范围确定,并且在这个范围内个元素的出现频率较高。
//算法描述:为取值范围内的各个可能取到的元素建巢用一维数组表示,巢中
//    巢中存放该元素出现的个数(通过遍历待排序数统计存入)。按照巢的
//    顺序和巢中元素个数列出该有序序列。
//算法空间复杂度为:S(1)时间复杂度为:O(n)。

//例:20个非负数,其中每个数的取值范围为1~9。

#include<iostream>
#include<time.h>
using namespace std;
int myrand(int* src, int n)                      //随机函数,随机生成n个 0~9的数存入src数组中
{
    if(NULL == src||n < 0)         
    {
        cout << "err in args or ‘n‘" << endl;
        return 0;
    }
    else
    {
        srand(time(NULL));
        for(int i=0; i<n; i++)
        {
            src[i] = rand()%10;
        }
        return 1;
    }
}

void prin(const int* src, int n)                 //输出数组中的前n个元素
{
    for(int i=0; i<n; i++)
        cout << src[i] << "  ";
    cout << endl;
}

void home_sort(int arg[], int ar, int ser[], int se) //排序函数
{
    int i,j,t =0;
    for(i=0; i<ar; i++)
        ++ser[arg[i]];
    for(i=0; i<se; i++)
    {
            for(j=0; j<ser[i]; j++)
            {
                arg[t] = i;
                ++t;
            }
    }
}

int main()
{
    int arg[20],se[10] = {0};
    if(myrand(arg,20))
        prin(arg,20);
    home_sort(arg, 20, se, 10);
    prin(arg, 20);    
    return 0;
}

时间: 2024-08-27 12:54:13

鸽巢排序算法描述和代码举例的相关文章

经典排序算法 - 鸽巢排序Pigeonhole sort

经典排序算法 - 鸽巢排序Pigeonhole sort 原理类似桶排序,同样需要一个很大的鸽巢[桶排序里管这个叫桶,名字无所谓了] 鸽巢其实就是数组啦,数组的索引位置就表示值,该索引位置的值表示出现次数,如果全部为1次或0次那就是桶排序 例如 var pigeonHole = new int[100]; pigeonHole[0]的值表示0的出现次数... pigeonHole[1]的值表示1的出现次数... pigeonHole[2]的值表示2的出现次数... 参考http://hi.bai

经典算法之排序问题(二):桶排序、鸽巢排序

鸽巢排序: 鸽巢排序, 也被称作基数分类, 是一种时间复杂度为(Θ(n))且在不可避免遍历每一个元素并且排序的情况下效率最好的一种排序算法. 但它只有在差值(或者可被映射在差值)很小的范围内的数值排序的情况下实用. 当涉及到多个不相等的元素, 且将这些元素放在同一个"鸽巢"的时候, 算法的效率会有所降低.为了简便和保持鸽巢排序在适应不同的情况, 比如两个在同一个存储桶中结束的元素必然相等 我们一般很少使用鸽巢排序, 因为它很少可以在灵活性, 简便性, 尤是速度上超过其他排序算法. 事实

C#实现鸽巢排序

/// <summary> /// 鸽巢排序 /// 创建一个长度大于等于待排序数组array元素中最大值的标记数组mark, /// 将数组array中元素值个数映射到mark数组中. /// 即array数组中的元素值对应mark数组的索引, /// array数组中该元素出现的个数对应mark数组索引的值. /// 然后将mark元素中出现的(不等于0)的索引值及个数依次放入array中. /// </summary> /// <param name="arr

经典排序算法总结(代码) .(转)

经典排序算法总结(代码) ·冒泡法 ·快速排序 ·插入排序 ·希尔(shell)排序 ·选择排序 ·堆排序 ·归并排序   附: 排序算法原理:http://zh.wikipedia.org/wiki/Category:%E6%8E%92%E5%BA%8F%E7%AE%97%E6%B3%95 flash演示:http://www.tyut.edu.cn/kecheng1/site01/suanfayanshi/list.asp?id=7 归并排序的具体介绍在下面的文章里: 递归算法学习---归并

十大经典排序算法的算法描述和代码实现

这里详细讲解了十大经典算法的分类,例如交换排序.插入排序.选择排序等比较类排序,以及计数排序.桶排序和基数排序的非比较类排序,分析了各种排序算法的复杂度和稳定性,还有JAVA代码的详细实现.对冒泡排序.插入排序.选择排序和堆排序等十种算法进行了详细的思想总结. 一.算法概述 1.算法分类 十种常见排序算法可以分为两大类:(1)比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn)因此也称为非线性时间比较类排序.(2)非比较类排序:不通过比较元素间的相对次序,它可以突

动画展现十大经典排序算法(附代码)

0.算法概述 0.1 算法分类 十种常见排序算法可以分为两大类: 比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此也称为非线性时间比较类排序. 非比较类排序:不通过比较来决定元素间的相对次序,它可以突破基于比较排序的时间下界,以线性时间运行,因此也称为线性时间非比较类排序. 0.2 算法复杂度 0.3 相关概念 稳定:如果a原本在b前面,而a=b,排序之后a仍然在b的前面. 不稳定:如果a原本在b的前面,而a=b,排序之后 a 可能会出现在 b 的后面.

十大排序算法(原理及代码实现细节)

本文参考一些书籍啊哈算法,数据结构与算法(清华大学),已经一些网上的博客 然后动图也是从网上偷来的(^_^),代码实现我尽量用大家容易懂的方式实现 数组居多,然后,桶排序(是别人代码,不过写的不完全正确后面会更新),都是学习嘛 有误的地方,还望各位指正,希望对你有帮助(其实很灵活的,在运用上),也不要这样就满足了 多多地运用,会使理解更深的. 按上面的顺序来吧 原理在代码里直接上动图吧 冒泡排序动图演示 冒泡排序代码实现 1 #include<iostream> 2 #include<c

Java排序算法 - 堆排序的代码

把内容过程中比较重要的一些内容片段做个备份,如下的资料是关于Java排序算法 - 堆排序的内容. import java.util.Arrays; public class HeapSort { int a[]={49,38,65,97,76,13,27,49,78,34,12,64,5,4,62,99,98,54,56,17,18,23,34,15,35,25,53,51}; public HeapSort(){ heapSort(a); } public void heapSort(int[

排序算法复习之代码练习

先贴上代码,以后再慢慢分析. 1 #include <time.h> 2 3 #define MAXSIZE 6000 4 typedef struct List{ 5 int r[MAXSIZE]; 6 int length; 7 }SqList; 8 9 void swap(SqList* L, int i, int j) 10 { 11 int temp = L->r[i]; 12 L->r[i] = L->r[j]; 13 L->r[j] = temp; 14