网上看了几个版本都写得不太一样。。。
class Solution():
def quick_sort(self, data):
"""
快速排序
"""
if len(data) >= 2:
mid = data[len(data) // 2]
left, right = [], []
data.remove(mid)
for num in data:
if num >= mid:
right.append(num)
else:
left.append(num)
return self.quick_sort(left) + [mid] + self.quick_sort(right)
else:
return data
def bucket_sort(self, nums, bucket_size = 5):
"""
桶排序
"""
#获取最大值最小值,可以直接用max、min
min_value = nums[0]
max_value = nums[1]
for num in nums:
if num < min_value:
min_value = num
elif num > max_value:
max_value = num
#分桶
bucket_count = (max_value - min_value) // bucket_size + 1
bucket_list = list([] for _ in range(bucket_count))
for num in nums:
#将元素放入对应桶中
idx = (num - min_value) // bucket_size
bucket_list[idx].append(num)
for i in range(len(bucket_list)):
#内部快排,将分桶中元素排序
bucket_list[i] = self.quick_sort(bucket_list[i])
result = []
for j in bucket_list:
result.extend(j)
return result
if __name__ == "__main__":
a = Solution().bucket_sort([5, 2, 3, 1])
print(a)
时间复杂度o(n+bucket_size)
空间复杂度o(n) 最坏o(n+bucket_size)
计数排序(桶排序的一种)
class Solution():
def count_sort(self, nums):
"""
计数排序
"""
#获取数组中最大值
upper = max(nums)
#初始化计数数组
f = [0 for _ in range(upper + 1)]
for num in nums:
f[num] += 1
result = []
for i in range(len(f)):
if f[i] > 0:
result.append(i)
return result
if __name__ == "__main__":
a = Solution().count_sort([5, 2, 3, 1])
print(a)
基数排序(桶排序的一种)
class Solution():
def radix_sort(self, nums):
"""
基数排序
"""
#获取最大值和idx索引从0开始
max_value = max(nums)
idx = 0
while 10 ** idx <= max_value:
bucket_list = [[] for _ in range(10)]
for num in nums:
i = (num // 10 ** idx) % 10
bucket_list[i].append(num)
nums.clear()
for bucket in bucket_list:
nums.extend(bucket)
idx += 1
return nums
if __name__ == "__main__":
a = Solution().radix_sort([5, 2, 3, 1, 10, 21])
print(a)