基数排序

基数排序是非比较排序算法,算法的时间复杂度是O(n). 相比于快速排序的O(nlgn),从表面上看具有不小的优势.但事实上可能有些出入,因为基数排序的n可能具有比较大的系数K.因此在具体的应用中,应首先对这个排序函数的效率进行评估.
基数排序的主要思路是,将所有待比较数值(注意,必须是正整数)统一为同样的数位长度,数位较短的数前面补零. 然后, 从最低位开始, 依次进行一次稳定排序,例如计数排序.这样从最低位排序一直到最高位排序完成以后, 数列就变成一个有序序列.

Radix_Sort( A, n)
{
    temp[n][n] ←0
    order[n]←0
    //假设total是数组A中最大数的位数
    m←1
    while(m<=total)
    {
        for(j←0; i<n; i++)
        {
            lsd ←(order[i]/pow(10,j) )%10
            temp[lsd][order[lsd]]←A[i]
            order[lsd]←order[lsd]+1
        }
        //数组A[]重新排序
        k←0
        for(i←0; i<10;i++)
        {
            if(order[i]!=0)
            {
                for(j←0;j<order[i];j++,k++)
                    A[k] ← temp[i][j]
            }
            order[i]←0
        }
	m←m+1   
      }
}

假设有数组A[10] = {73, 22, 93, 43, 55, 14, 28, 65, 39, 81}


   

附带代码如下:

/**---------------------------------------
                houyong
------------------------------------------*/
#include <stdio.h>
#include <stdlib.h>
void radixSort(int[]);
int main(void) {
	int data[10] = {73, 22, 93, 43, 55, 14, 28, 65, 39, 81};
	printf("\n排序前: ");
	int i;
	for(i = 0; i < 10; i++)
		printf("%d ", data[i]);
	putchar('\n');
	radixSort(data);
	printf("\n排序後: ");
	for(i = 0; i < 10; i++)
		printf("%d ", data[i]);
	printf("\n\n");
	return 0;
}


void radixSort(int data[])
{
	int temp[10][10] = {0};
	int order[10] = {0};
	int n = 1;
	while(n <= 10)
	{
		int i;
		for(i = 0; i < 10; i++)
		{
			int lsd = ((data[i] / n) % 10);
			temp[lsd][order[lsd]] = data[i];
			order[lsd]++;
		}
		// 重新排列
		int k = 0;
		for(i = 0; i < 10; i++)
		{
			if(order[i] != 0)
			{
				int j;
				for(j = 0; j < order[i]; j++, k++)
				{
					data[k] = temp[i][j];


				}
			}
			order[i] = 0;
			}
		n *= 10;
		}
}
/**
排序前: 73 22 93 43 55 14 28 65 39 81


排序後: 14 22 28 39 43 55 65 73 81 93
*/


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值