用C语言实现简单的基数排序

    八大排序算法有:冒泡排序、插入排序、选择排序、快速排序、希尔排序、堆排序、归并排序、基数排序。前面七种网上都有很多例子,但是最后一种基数排序却很少看到,所以我总结了一下,并且自己写了一个简单的实现。

    基数排序是一种分配排序,其基本思想是:排序过程无须比较关键字,而是通过“分配”和“收集”过程来实现排序。它们的时间复杂度可达到线性O(n)。基数排序所做的事情,是对N位分别进行排序。从直觉上来看,人们可能会觉得应该首先按最高有效位进行排序,不过这点与我们的直觉相反,基数排序首先对最低有效位数字进行排序。如果我们每次比较r bits,则需要进行b/r趟,每趟进行计数排序需要O(n+2^r),则总的时间复杂度为O(b/r(n+2^r))。

    理论上来说,基数排序的速度是以上几种排序方法中最快的,可以达到O(N),而其它的排序算法最快也只有O(N*logN)。但是,基数排序需要占用额外的空间,而且只支持整数进行排序。

    基数排序的演示可以看这里:基数排序

    实现代码如下:

#include 
#include 

/* 获取输入数字的索引值,dec指定数字的位数,3代表百位数,order指定需要获取哪一位的索引,1代表个位,2代表十位,3代表百位 */
int get_index(int num, int dec, int order)
{
    int i, j, n;
    int index;
    int div;

	/* 根据位数,循环减去不需要的高位数字 */
    for (i=dec; i>order; i--) {
        n = 1;
        for (j=0; j=0; i--) {
        index = get_index(array[i], dec, order);  /* 从数组尾开始依次获得各个数字的索引 */
        j = --num[index];  /* 根据索引计算该数字在按位排序之后在数组中的位置 */
        tmp[j] = array[i]; /* 数字放入临时数组 */
    }

    for (i=0; i

    运行结果如下:

baishen@sjtu:~/sort$ ./radix 
before
258  976  515  337  359  701  916  494  303  175  677  825  131  560  147  254  759  814  917  382  452  114  873  585  881  127  819  658  461  435  
the 1 time
560  701  131  881  461  382  452  303  873  494  254  814  114  515  175  825  585  435  976  916  337  677  147  917  127  258  658  359  759  819  
the 2 time
701  303  814  114  515  916  917  819  825  127  131  435  337  147  452  254  258  658  359  759  560  461  873  175  976  677  881  382  585  494  
the 3 time
114  127  131  147  175  254  258  303  337  359  382  435  452  461  494  515  560  585  658  677  701  759  814  819  825  873  881  916  917  976  
final
114  127  131  147  175  254  258  303  337  359  382  435  452  461  494  515  560  585  658  677  701  759  814  819  825  873  881  916  917  976  

  

转载于:https://www.cnblogs.com/compulsive/archive/2011/09/22/2185079.html

你可能感兴趣的:(用C语言实现简单的基数排序)