`
kmplayer
  • 浏览: 509823 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

基数排序

阅读更多
详细解释参考:http://en.wikipedia.org/wiki/Radix_sort
1,"基数排序法"(radix sort)则是属于"分配式排序"(distribution sort),基数排序法又称"桶子法"(bucket sort)或bin sort.
它是透过键值的部份资讯,将要排序的元素分配至某些"桶"中,藉以达到排序的作用.

复杂度分析:
基数排序法是属于稳定性的排序,其时间复杂度为O(kN),其中k为key的长度,而N为个数.
空间复杂度为O(kN)。

2,基数排序的方式可以采用LSD(Least significant digital)或MSD(Most significant digital),LSD的排序方式由键值的最右边开始,而MSD则相反,由键值的最左边开始。
LSD的基数排序适用于位数小的数列,如果位数多的话,使用MSD的效率会比较好

3,以LSD为例,假设原来有一串数值如下所示:
73, 22, 93, 43, 55, 14, 28, 65, 39, 81
首先根据个位数的数值,在走访数值时将它们分配至编号0到9的桶子中:
  0
  1 81
  2 22
  3 73 93 43
  4 14
  5 55 65
  6
  7
  8 28
  9 39
接下来将这些桶子中的数值重新串接起来,成为以下的数列:
  81, 22, 73, 93, 43, 14, 55, 65, 28, 39
接着再进行一次分配,这次是根据十位数来分配:
  0
  1 14
  2 22 28
  3 39
  4 43
  5 55
  6 65
  7 73
  8 81
  9 93
接下来将这些桶子中的数值重新串接起来,成为以下的数列:
  14, 22, 28, 39, 43, 55, 65, 73, 81, 93

4,实例代码:
#include <iostream>
using namespace std;

int maxbit(int data[],int n) //辅助函数,求数据的最大位数
{
    int d = 0;
    int * tmp = new int[n];
    for(int i = 0 ;i < n;i++)
        tmp[i]= data[i];
    for(int i = 0;i < n;i++)
    {
        int p =1;
        while(tmp[i]/10 > 0)
        {
            p++;
            tmp[i] = tmp[i]/10;
        }
        if(d < p) d = p;
    }
    delete [] tmp;
    return d;
}

void radixsort(int data[],int n) //基数排序
{
    int d = maxbit(data,n); //最大位数
    int * tmp = new int[n];
    int * count = new int[10]; //计数器
    int radix = 1;
    for(int i = 0; i< d;i++) //进行d次排序
    {
        int k;
        for(int j = 0;j < 10;j++)
            count[j] = 0; //每次分配前清空计数器
        for(int j = 0;j < n; j++)
        {
            k = (data[j]/radix)%10; //统计每个桶中的记录数
            count[k]++; //懂
        }
        for(int j = 1;j < 10;j++)
            count[j] = count[j-1] + count[j]; //将tmp中的位置依次分配给每个桶
        //这里根据基数把元素放到tmp中. 从后往前放,保证上一次的次序
        for(int j = n-1;j >= 0;j--) //将所有桶中记录依次收集到tmp中
        {
            k = (data[j]/radix)%10;
            count[k]--;
            tmp[count[k]] = data[j];
        }
        for(int j = 0;j < n;j++) //将临时数组的内容复制到data中
            data[j] = tmp[j];

        //显示每步排序完毕后的结果
        for(int j=0;j<n;j++)
            cout<<data[j]<<" ";
        cout<<endl;

        radix *= 10;
    }
    delete [] tmp;
    delete [] count;
}

void Output(int data[], int n)
{
    for(int i = 0 ; i < n ; i++ )
        cout << data[i] << " ";
    cout << endl;
}


int main()
{
    int data[]={73, 22, 93, 43, 55, 14, 28, 65, 39, 81};
    int n=sizeof(data)/sizeof(data[0]);
    radixsort(data,n);
    Output(data,n);
    return 0;
}

分享到:
评论

相关推荐

    基数排序及流程图

    包括了基数排序的实现代码和流程图。 先对个位数字进行统计,然后根据个位进行排序,然后对十位进行统计,然后根据十位进行排序,即可获得最终结果。 时间效率:待排序列为n个记录,10个关键码,关键码的取值范围为0...

    数据结构基数排序数据结构基数排序

    数据结构中的基数排序是一种非比较型整数排序算法,它基于数字的位宽进行排序,尤其适用于处理大量相同数字的情况。基数排序的核心思想是将数字按照位数从低位到高位分别进行桶排序,最终得到完全有序的序列。下面将...

    基数排序过程及程序基数排序过程及程序

    基数排序(Radix Sort)是一种非比较型的整数排序算法,其原理是将整数按位数切割成不同的数字,然后按每个位数分别比较。由于整数也可以表示字符串、卡片等数据(当成是整数即可),所以基数排序并不限于整数。它是...

    基数排序、堆排序、希尔排序、直接插入排序

    这里我们将深入探讨四种常见的排序算法:基数排序、堆排序、希尔排序和直接插入排序。 首先,基数排序是一种非比较型整数排序算法,它的基本思想是将整数按位数切割成不同的数字,然后按每个位数分别比较。基数排序...

    C++写基数排序算法

    基数排序是一种非比较型整数排序算法,其原理是将整数按位数切割成不同的数字,然后按每个位数分别比较。在C++中实现基数排序,主要涉及到数组、计数排序以及位操作等技术。以下是关于基数排序及其C++实现的详细解释...

    基于双向链表的基数排序

    基数排序(radix sort)又称桶排序(bucket sort),相对于常见的比较排序,基数排序是一种分配式排序,需要将关键字拆分成数字位。并且按照数字位的值对数据项进行排序,这种方法不需要进行比较操作。 为了尽可能少的...

    基数排序链表法

    基数排序法用链表完成使用C语言适用于刚入门的学者

    数据结构实验报告--链式基数排序算法.doc

    链式基数排序是一种非比较型整数排序算法,它的原理是将整数按位数切割成不同的数字,然后按每个位数分别比较。在描述中提到的实验报告中,主要目标是实现一个链式基数排序算法,用于对一组数据进行最低位优先的排序...

    Radix Sort (基数排序)排序算法

    ### Radix Sort (基数排序) 排序算法详解 #### 一、算法介绍与应用场景 基数排序(Radix Sort)是一种非比较型整数排序算法,其原理是将整数按位数切割成不同的数字,然后按每个位数分别比较。由于整数也可以表达...

    基数排序-radix sort

    基数排序是一种非比较型整数排序算法,其原理是将整数按位数切割成不同的数字,然后按每个位数分别比较。这种排序方法对于大数据量的处理非常有效,尤其适合于数据范围远大于内存大小的情况。以下是基数排序的详细...

    基数排序C语言实现

    基数排序是一种非比较型整数排序算法,它的原理是将整数按位数切割成不同的数字,然后按每个位数分别比较。这种排序方法非常适合处理大量整数的排序,尤其在数字位数相同或者相差不大的情况下,效率较高。本文将深入...

    数据结构之基数排序数据结构之基数排序数据结构之基数排序

    基数排序是一种非比较型整数排序算法,其原理是将整数按位数切割成不同的数字,然后按每个位数分别比较。这种排序方法适用于处理大量数据,且数据的范围不超过10的某个幂次方的情况。基数排序是基于多关键字排序的一...

    基数排序算法 java实现

    基数排序是一种非比较型整数排序算法,它的原理是将整数按位数切割成不同的数字,然后按每个位数分别比较。这种算法对于大数据量的排序尤其有效,因为其时间复杂度为线性,即O(n*k),其中n是待排序的元素数量,k是每...

    基数排序_C语言_源码_数据结构

    基数排序是一种非比较型整数排序算法,其原理是将整数按位数切割成不同的数字,然后按每个位数分别比较。这种算法对于大数据量的排序非常有效,尤其是在数据范围不超过0-9的情况下。接下来,我们将深入探讨基数排序...

    基数排序基数排序基数排序

    基数排序是一种非比较型整数排序算法,它的原理是将整数按位数切割成不同的数字,然后按每个位数分别比较。这种排序方法不需要进行记录关键字间的比较,而是通过“分配”和“收集”操作对单逻辑关键字进行排序。 1....

    C经典算法之基数排序法

    ### C经典算法之基数排序法 #### 知识点概览 1. **排序算法的基础概念** - 排序算法的基本定义与分类 - 比较性排序与非比较性排序的区别 - 稳定排序与不稳定排序的概念 2. **基数排序的原理** - 分配式排序的...

    基数排序课程设计.rar

    基数排序是一种非比较型整数排序算法,它的原理是将整数按位数切割成不同的数字,然后按每个位数分别比较。这个课程设计主要涵盖了基数排序的基本概念、实现方式以及C++编程技术。在本课程设计中,你将学习到如何用...

    用stl实现基数排序算法

    基数排序是一种非比较型整数排序算法,其原理是将整数按位数切割成不同的数字,然后按每个位数分别比较。它不是基于比较的排序,而是通过创建额外的数据结构,比如计数器或者桶,来达到排序的目的。在处理大量数据时...

    简单的基数排序算法,STL实现

    基数排序是一种非比较型整数排序算法,其原理是将整数按位数切割成不同的数字,然后按每个位数分别比较。这种算法对于大数据量的排序尤其有效,因为它是线性时间复杂度的,即O(nk),其中n是元素数量,k是数字的最大...

Global site tag (gtag.js) - Google Analytics