# 选择排序:每次循环把当前循环中最小的元素移动到正确位置# 方式一:每次循环都移动defselect_sort1(nums):for i inrange(n):for j inrange(i +1, n):if nums[i]> nums[j]:
nums[i], nums[j]= nums[j], nums[i]# 方式二:记录本次循环中最小元素的index,再移动defselect_sort2(nums):for i inrange(n):
mix_index = i
for j inrange(i +1, n):if nums[mix_index]> nums[j]:
mix_index = j
nums[i], nums[mix_index]= nums[mix_index], nums[i]
三、插入排序
# 插入排序:类似玩扑克牌抓牌然后插入到正确位置的动作# 1、正向遍历乱序的list(列表的后半部分)# 2、反向遍历有序的list(列表的前半部分)# 3、如果当前遍历的乱序列表中的元素比有序列表的最大元素还小,就找位置插入definsert_sort(nums):for i inrange(1, n):if nums[i]< nums[i -1]:
current = nums[i]# 当前待插入元素for j inrange(i -1,-1,-1):if nums[j]>= current:
nums[j +1]= nums[j]# 向后移动一位
nums[j]= current # 把当前待插入元素 current 插入进去
四、shell 排序
# shell 排序:和插入排序类似,只是插入排序的 step 固定为 1,而希尔排序的 step 会变化至 1,比插入排序更高效defshell_sort(nums):
step =len(nums)//2while step >0:for i inrange(step,len(nums)):while i >= step and nums[i]< nums[i-step]:
nums[i], nums[i-step]= nums[i-step], nums[i]
i -= step
step //=2
五、快速排序
defquick_sort(nums:list):iflen(nums)<=1:return nums
mid = nums.pop(len(nums)//2)# left = []# right = []# for num in nums:# if num <= mid:# left.append(num)# else:# right.append(num)# 如果不使用上述的 for 循环,可以用 filter
left =list(filter(lambda item: item <= mid, nums))
right =list(filter(lambda item: item > mid, nums))return quick_sort(left)+[mid]+ quick_sort(right)
六、归并排序
defmerge_sort(nums):iflen(nums)==1:return nums
mid_index =len(nums)//2
left = merge_sort(nums[:mid_index])
right = merge_sort(nums[mid_index:])return merge(left, right)defmerge(left, right):
result =[]while left and right:
result.append(left.pop(0)if left[0]<= right[0]else right.pop(0))
result.extend(left or right)return result
python实现几种常用的排序算法一、冒泡排序二、选择排序三、插入排序四、shell 排序五、快速排序六、归并排序一、冒泡排序# 冒泡排序:每次循环比较相邻的两个元素def maopao_sort(nums): for i in range(n - 1): for j in range(n - 1 - i): if nums[j] > nums[j + 1...