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