# 采用左闭右闭 defquick_sort(nums,lo,hi):#nums:List[int] ,lo:int,hi:int if lo+1>=hi: return first=lo last = hi-1 pivot = nums[first] while first<last: while first<last and nums[last]>=pivot: last=last-1 nums[first]=nums[last] while first<last and nums[first]<=pivot: first=first+1 nums[last]=nums[first] nums[first]=pivot quick_sort(nums,lo,first) quick_sort(nums,first+1,hi)
defmerge(a, b): c = [] h = j = 0 while j < len(a) and h < len(b): if a[j] < b[h]: c.append(a[j]) j += 1 else: c.append(b[h]) h += 1 if j == len(a): for i in b[h:]: c.append(i) else: for i in a[j:]: c.append(i) return c defmerge_sort(lists): if len(lists) <= 1: return lists middle = len(lists)//2 left = merge_sort(lists[:middle]) right = merge_sort(lists[middle:]) return merge(left, right) if __name__ == '__main__': a = [14, 2, 34, 43, 21, 19] print (merge_sort(a))
[2, 14, 19, 21, 34, 43]
插入排序
将无序逐个添加至有序中
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
definsert_sort(arr): """插入排序""" # 第一层for表示循环插入的遍数 for i in range(1, len(arr)): # 设置当前需要插入的元素 current = arr[i] # 与当前元素比较的比较元素 pre_index = i - 1 while pre_index >= 0and arr[pre_index] > current: # 当比较元素大于当前元素则把比较元素后移 arr[pre_index + 1] = arr[pre_index] # 往前选择下一个比较元素 pre_index -= 1 # 当比较元素小于当前元素,则将当前元素插入在 其后面 arr[pre_index + 1] = current return arr
insert_sort([11, 2,1,4,5,3,9])
[1, 2, 3, 4, 5, 9, 11]
冒泡排序
思路:依次比较相邻的元素,前者大于后者则交换,每趟将最大值交换至最右
1 2 3 4 5 6 7 8 9 10 11 12 13 14
defbubble_sort(nums):# nums:List[int] n = len(nums) for i in range(1,n): swapped = False for j in range(1,n-i+1): if nums[j]<nums[j-1]: nums[j],nums[j-1]=nums[j-1],nums[j] # 两者值交换 swapped= True ifnot swapped: break nums=[2,1,4,3,6,5] bubble_sort(nums) print(nums)
[1, 2, 3, 4, 5, 6]
选择排序
思路:每次选择最小者放置左边
1 2 3 4 5 6 7 8 9 10 11
defselection_sort(nums): n = len(nums) for i in range(n): pos = i for j in range(i+1,n): if nums[j]<nums[pos]: pos=j nums[pos],nums[i]=nums[i],nums[pos] nums=[3,1,2,5,4,6] selection_sort(nums) nums