幾種排序演算法的Python形式
阿新 • • 發佈:2018-12-10
直接見程式碼吧,因為比較簡單
依次為
冒泡
選擇
快排
插入
歸併
堆排
桶排
class Sort: def bubble(self, nums): for i in range(len(nums)-1): for j in range(len(nums)-1-i): if nums[j] > nums[j+1]: nums[j], nums[j+1] = nums[j+1], nums[j] print('Bubble: {}'.format(nums)) def pick(self, nums): for i in range(len(nums)-1): for j in range(i+1, len(nums)): if nums[i] > nums[j]: nums[i], nums[j] = nums[j], nums[i] print('Pick: {}'.format(nums)) def quick(self, nums): def qsort(nums, l, r): i, j = l, r if i >= j: return pivot = nums[i] while i < j: while i < j and nums[j] >= pivot: j -= 1 nums[i] = nums[j] while i < j and nums[i] < pivot: i += 1 nums[j] = nums[i] nums[i] = pivot qsort(nums, l, i-1) qsort(nums, j+1, r) qsort(nums, 0, len(nums)-1) print('Quick: {}'.format(nums)) def insert(self, nums): for i in range(1, len(nums)): while nums[i]<nums[i-1] and i > 0: nums[i], nums[i-1] = nums[i-1], nums[i] i -= 1 print('Insert: {}'.format(nums)) def merge(self, nums): def chaifen(nums, l, r): if l >= r: return m = (l + r) // 2 chaifen(nums, l, m) chaifen(nums, m+1, r) innermerge(nums, l, m, r) def innermerge(nums, l, m, r): i, j = l, m+1 res = [] while i <= m and j<=r: if nums[i] < nums[j]: res.append(nums[i]) i += 1 else: res.append(nums[j]) j += 1 while i <= m: res.append(nums[i]) i += 1 while j <= r: res.append(nums[j]) j += 1 nums[l:r+1] = res[:] chaifen(nums, 0, len(nums)-1) print('Merge: {}'.format(nums)) def heap(self, nums): def innerheap(nums, i=0): while 2*i+1 <= len(nums)-1: while nums[i] < nums[2*i+1]: nums[i], nums[2*i+1] = nums[2*i+1], nums[i] innerheap(nums, 2*i+1) if 2*i+2 <= len(nums)-1: while nums[i] < nums[2 * i + 2]: nums[i], nums[2 * i + 2] = nums[2 * i + 2], nums[i] innerheap(nums, 2*i+2) i += 1 res = [] while nums: innerheap(nums) res.insert(0, nums.pop(0)) print('Heap: {}'.format(res)) def bucket(self, nums): n, res = len(nums), [] bucks = [[] for i in range(n)] lenrg = max(nums) - min(nums) minNum = min(nums) for num in nums: idx = int(min(max((num - minNum)/lenrg * n, 0), n-1)) bucks[idx].append(num) for subB in bucks: if subB: self.insert(subB) res += subB print('Bucket: {}'.format(res)) if __name__=='__main__': nums = [1,4,2,8,5,7,10,3,9] s = Sort() print('Original: {}'.format(nums)) s.bubble(nums[:]) print('#'*100) print('Original: {}'.format(nums)) s.pick(nums[:]) print('#'*100) print('Original: {}'.format(nums)) s.quick(nums[:]) print('#'*100) print('Original: {}'.format(nums)) s.insert(nums[:]) print('#'*100) print('Original: {}'.format(nums)) s.merge(nums[:]) print('#'*100) print('Original: {}'.format(nums)) s.heap(nums[:]) print('#'*100) print('Original: {}'.format(nums)) s.bucket(nums[:]) print('#'*100)
執行結果在下面