分配排序之--桶排序

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

参考小灰ttps://mp.weixin.qq.com/s/qrboxA5SwN7AbAcpZ_dpNQ

class Solution(object):
    def sortArray(self, nums):
        """
        :type nums: List[int]
        :rtype: List[int]
        """
# ------------------------------------------------------------------------  
        def bucketSort(data):
            # 1 得到数列的最大值和最小值,并计算差值
            maxNum, minNum = max(data), min(data)   
            d = maxNum - minNum
            if data == [] or d == 0: return data
            
            # 2 初始化桶
            bucketNum = len(data)  # 这里创建的桶数量等于原始数列的元素数量
            buckets = [[] for _ in range(bucketNum)]
            
            # 3 遍历原始数组,将每个元素放入桶中
            for i in data:  # 除了最后一个桶只包含数列最大值,前面各个桶的区间按照比例确定。
                buckets[(int)((i - minNum)*(bucketNum-1)/d)].append(i) # 按照比例来定位元素属于第几个桶
            
            # 4 对每个桶内部进行排序并输出全部元素
            sortedArray = []
            for bucket in buckets:
                bucket.sort()
                sortedArray.extend(bucket)
                
            return sortedArray
           
# ------------------------------------------------------------------------  
        return bucketSort(nums)

 

#include<stdio.h>
#include<malloc.h>
#define MAXNUM 1000
//*****************************************************桶排序******************************************
void Bucket_sort(int A[],int n)
{
	int k=0;
	int *Bucket=(int *)malloc(sizeof(int)*MAXNUM);
	
	for(int i=0;i<MAXNUM;i++)    //初始化Bucket
		Bucket[i]=0;

	for(i=0;i<n;i++)          //根据A数组给Bucket赋值,Bucket[A[i]]---值=A[i]的个数
		Bucket[A[i]]++;       //即在第A[i]个桶上插1面红旗
	
	//此时桶Bucket中已经存有A的顺序信息,即第Bucket的序号i 就是A[i]
	for(i=0;i<MAXNUM;i++)     //遍历桶
		for(int j=1;j<=Bucket[i];j++) //找到有红旗的桶,输出该桶的序号,有几面红旗 输几遍 数字 
			A[k++]=i;     //i表示桶的序号,

	free(Bucket);
}
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]);
    
	Bucket_sort(A,n);

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

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值