基数排序
import time
def radix_sort(nums):
"""
基数排序
Args:
nums (list[int]): 待排序的数字列表
Returns:
list[int]: 排序后的数字列表
"""
max_digit = max(nums)
for digit in range(1, max_digit + 1):
buckets = [[] for _ in range(10)]
for num in nums:
buckets[(num // digit) % 10].append(num)
i = 0
for bucket in buckets:
for num in bucket:
nums[i] = num
i += 1
print(buckets)
return nums
t = time.time()
res=radix_sort([10,9,78,3,4,90,9000123])
dur = time.time() - t
print(dur)
print(res)
命题
给定一个无序的数组 nums
,返回 数组在排序之后,相邻元素之间最大的差值 。如果数组元素个数小于 2,则返回 0
。
#include<vector>
#include<chrono>
class Solution {
public:
int maximumGapvector<int>& nums {
int n = nums.size();
if (n < 2) {
return 0;
}
int exp = 1;
std::vector<int> buf(n);
int maxVal = *std::max_element(nums.begin(), nums.end());
while (maxVal >= exp) {
// 数字长度固定是0-9,且cnt每次只记录一个数位的排序
std::vector<int> cnt(10);
// 针对nums中所有的数字中各个数位进行排序,从个位开始,百位,千位等等
for (int i = 0; i < n; i++) {
int digit = (nums[i] / exp) % 10;
// cnt中的index对应当前位的数字,value对应当前位都是index的个数
cnt[digit]++;
}
// 如果cnt[7] = 4, 表示当前位数字是7的num有4个,
// 这四个后面实际升序位置是cnt[1] + cnt[2] + .. + cnt[6] ~ cnt[1] + cnt[2] + .. cnt[6] + cnt[7]
for (int i = 1; i < 10; i++) {
cnt[i] += cnt[i - 1];
}
// 根据排序结果进行更新
for (int i = n - 1; i >= 0; i--) {
int digit = (nums[i] / exp) % 10;
buf[cnt[digit] - 1] = nums[i];
// 上一步给的位置是当前数字最大index,后续相同数字的需要往前排
cnt[digit]--;
}
// 每次数位排完序后更新到nums
copy(buf.begin(), buf.end(), nums.begin());
exp *= 10;
}
int ret = 0;
for (int i = 1; i < n; i++) {
ret = std::max(ret, nums[i] - nums[i - 1]);
}
return ret;
}
};
Solution s
std::vector<int> input = {100,10,19,2389,89,12,9000999}
auto start = std::chrono::high_resolution_clock::now();
std::cout<<"max gap:"<< s.maximumGap(input)
auto end = std::chrono::high_resolution_clock::now();
auto duration = std::chrono::duration_cast<std::chrono::milliseconds>(end - start);
std::cout << "time in seconds: " << duration.count()
// std::cout<<duration
input
//作者:力扣官方题解
//链接:https://leetcode.cn/problems/maximum-gap/solutions/498428/zui-da-jian-ju-by-leetcode-solution/