现在的位置: 首页 > 综合 > 正文

c++实现基数排序

2013年10月21日 ⁄ 综合 ⁄ 共 1597字 ⁄ 字号 评论关闭

(以下介绍内容转自百科)

基数排序的方式可以采用LSD(Least significant digital)或MSD(Most significant digital),LSD的排序方式由键值的最右边开始,而MSD则相反,由键值的最左边开始。   

以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   

这时候整个数列已经排序完毕;如果排序的对象有三位数以上,则持续进行以上的动作直至最高位数为止。   

LSD的基数排序适用于位数小的数列,如果位数多的话,使用MSD的效率会比较好。MSD的方式与LSD相反,是由高位数为基底开始进行分配,但在分配之后并不马上合并回一个数组中,而是在每个“桶子”中建立建立“子桶”,将每个桶子中的数值按照下一数位的值分配到“子桶”中。在进行完最低位数的分配后再合并回单一的数组中。

#include <iostream>
#include <stdlib.h>
using namespace std;
//存放位数上的数所对应的数组
int **temp;
int *forIndex;
//用max来确定最大位数,用min来确定取哪个位置的数
int radixSort(int t[], const int &length, int max, int min)
{
    if((min + 1) > max)
        return 0;
    //初始化中间变量
    for(int i = 0; i < 10; i++)
    {
	forIndex[i] = 0;
    }
    static int step = 0;
    //用于取得某个固定位的值所需的除法位数
    step = step * 10 ? step * 10 : 1;
    //将数组按照指定位数上的数分配到对应的中间变量数组中
    int index, j = 0;
    for(int i = 0; i < length; i++)
    {
	index = t[i] / step % 10;
	temp[index][forIndex[index]] = t[i];
        forIndex[index]++;
    }
    //将中间变量数组中的数重新赋值到数组中
    int k = 0;
    for(int i = 0; i < 10; i++)
    {
	for(int j = 0; j < forIndex[i]; j++)
	{
	    t[k] = temp[i][j];
            k++;
	}
    }
    min++;
    radixSort(t, length, max, min);
}
template <typename T>
int printArray(T *const t, int len)
{
    for(int i = 0; i < len; i++)
    {
    cout << t[i] << ';';
    }
    cout<<endl;
}
int main(int argc, char *argv[])
{
    int c[10] = {22,21,10,13,140,4,3,2,1,0};
    temp = new int*[10];
    for(int i = 0; i < 10; i++)
    {
	temp[i] = new int[sizeof(c)/sizeof(int)];
    }
    forIndex = new int[10];

    radixSort(c, sizeof(c)/sizeof(int), 3, 0);
    printArray(c, sizeof(c)/sizeof(int));

    delete temp;
    delete forIndex;
    return 0;    
}

抱歉!评论已关闭.