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();
}