classSolution: defshell_sort(self, arr): n = len(arr) h = 1 while h < n // 3: h = 3 * h + 1 while h >= 1: for i inrange(h, n): for j inrange(i, h - 1, -h): if arr[j] < arr[j - h]: arr[j], arr[j - h] = arr[j - h], arr[j] h = h // 3 return arr
classSolution: defmerge_sort(self, arr): n = len(arr) if n < 2: return arr mid_idx = n // 2 left, right = arr[:mid_idx], arr[mid_idx:] return self.merge(self.merge_sort(left), self.merge_sort(right)) defmerge(self, left, right): result = [] while left and right: if left[0] <= right[0]: result.append(left.pop(0)) else: result.append(right.pop(0)) if left: result += left if right: result += right return result if __name__ == "__main__": arr = [3, 44, 38, 5, 47, 15, 36, 26, 27, 2, 46, 4, 19, 50, 48] print(f"排序前:{arr}") print(f"排序后:{Solution().merge_sort(arr)}")
classSolution: def__init__(self, arr): self.length = len(arr) self.build_max_heap(arr) defbuild_max_heap(self, arr): for i inrange(self.length // 2, -1, -1): self.heapify(arr, i) defheapify(self, arr, i): left = 2 * i + 1 right = 2 * i + 2 largest = i if left < self.length and arr[left] > arr[largest]: largest = left if right < self.length and arr[right] > arr[largest]: largest = right if largest != i: arr[i], arr[largest] = arr[largest], arr[i] self.heapify(arr, largest) defheap_sort(self, arr): for i inrange(self.length - 1, 0, -1): arr[0], arr[i] = arr[i], arr[0] self.length -= 1 self.heapify(arr, 0) return arr
classSolution: defbucket_sort(self, arr): max_value = max(arr) bucket = {i: [] for i inrange(max_value + 1)} n = len(arr) for i inrange(n): num = arr[i] bucket[num].append(num) arr = [] for i inrange(max_value + 1): if bucket[i]: arr += sorted(bucket[i]) return arr
classSolution: defradix_sort(self, arr): max_value = max(arr) iter_cnt = len(str(max_value)) for i inrange(iter_cnt): bucket = [[] for _ inrange(10)] for n in arr: idx = (n // 10 ** i) % 10 bucket[idx].append(n) arr.clear() for b in bucket: arr += b return arr