分配排序之--基数排序

https://leetcode-cn.com/submissions/detail/24108457/ 

class Solution(object):
    def maximumGap(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
# ------------------------------------------------------------------------
        def radixSort(nums): 
            n = 1                # 1 统计最大数的位数
            while max(nums)/(10**n) > 0: 
                n += 1
            
            for x in range(n):   # 2 根据各位数循环排序
                buckets = [[] for _ in range(10)] # 因为每一位数字都是0~9,故建立10个桶
                for i in nums:
                    buckets[i/(10**x)%10].append(i) #得到每位基数,并将对应元素入桶
                
                j = 0
                for k in range(0,10):
                    if len(buckets[k]) != 0: #若桶不为空
                        for y in buckets[k]: #将该桶中每个元素
                            nums[j]= y     #放回到数组中
                            j += 1
            return nums 
# ------------------------------------------------------------------------
        return radixSort(nums)

 

#include<stdio.h>
#include<malloc.h>
#define MAXNUM 1000

//******************************************基数排序**********************************************************

int getdigit(int x,int d)  
{   
    int a[] = {1, 1, 10, 100};   //最大三位数,所以这里只要百位就满足了。
    return (x/a[d]) % 10;  
}  
void Radix_Sort(int A[], int n,int d)
{  
	int radix=10;
    int *Bucket = (int *)malloc(sizeof(int)*radix); //可以 int Bucket[MAXNUM]
    int *Result = (int *)malloc(sizeof(int)*n);  //不能 int Result[n],n没确定
	
	for(int k=1;k<=d;k++)
	{
		for (int i = 0; i < radix; i++)    //把1000个桶初始化
			Bucket[i] = 0;

		for (i = 0; i < n; i++) 
			Bucket[ getdigit(A[i],k) ] ++;                    // Bucket[A[i]]---值=A[i]的个数

		for (i = 1; i < radix; i++)
			Bucket[i] = Bucket[i - 1] + Bucket[i];       //Bucket[i]---值<=i的个数 

		for (i = n - 1; i >= 0; i--) 
			Result[--Bucket[getdigit(A[i],k)] ] = A[i];        //排序
		
		for (i = 0; i < n; i++)      
			A[i] = Result[i];               //输出到原始数组
	}
	free(Bucket); 
	free(Result);
} 
//*************************************************测试**********************************************
void  main()
{
    int n;	
	printf("请输入待排序的个数:");
	scanf("%d",&n);	 
	int *A = (int *)malloc(sizeof(int)*n);			

	printf("输入排序前:\n");
	for (int i = 0; i < n; i++)
        scanf("%d",&A[i]);
    
	Radix_Sort(A, n, 3);

	printf("输出排序后:\n");
	for (i = 0; i < n; i++)
        printf("%d ", A[i]);  //等价于 *(A+i)	
	getchar();getchar();
}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值