快排的实现
原理: 选取一个基点(列表第一个元素),然后从右往左对比,比这个基点小的数字放在left列表中,比基点大的数字放在right列表中
这样 left 所有元素 肯定是小于 right的所有元素的,使得两个列表有了顺序 返回 left + [基点] + right
同样的,对于left或者right内部的顺序也算一个逻辑,很容易想到使用递归一层层处理
关键点:
- 选基点,比大小,分左右
- 递归思想
def kp_func(ori_list: list):
def _sort(arr_list: list):
if not arr_list:
return []
base_item_value = arr_list[0]
right = []
left = []
for i in range(1, len(arr_list)):
if arr_list[i] > base_item_value:
right.append(arr_list[i])
else:
left.append(arr_list[i])
return _sort(left) + base_item_value + _sort(right)
return kp_func(ori_list)
if __name__ == "__main__":
kp_func([23,4,34,68,67,45,78789,245,3,45,563,4,6,56,4,5])
# 返回结果 [3, 4, 4, 4, 5, 6, 23, 34, 45, 45, 56, 67, 68, 245, 563, 78789]
冒泡法排序
原理:冒泡法就比较简单了,核心思想是选举,不需要考虑太多,只要a比b大,那a就应该排到b的前面
关键点:
- 从长度为n的列表里找出最大值max_value ,放到n列表的最右边
- 从长度为n-1的列表里找出最大值max_value, 放到n-1列表的最右边
- ......
def mao_pao(arr_list: list):
current_len_num = len(arr_list)
while current_len_num > 0:
has_order_action = False
for i in range(current_len_num - 1):
if arr_list[i] > arr_list[i+1]:
has_order_action = True
arr_list[i], arr_list[i+1] = arr_list[i+1], arr_list[i]
if not has_order_action: # 如果这次没有任何两个元素交换位置,说明剩余的排序已经是有序的了
break
current_len_num -= 1 # 下一次从 current_len_num - 1 中找出最大的数字
return arr_list
if __name__ == "__main__":
mao_pao([1,4,6,35,8,5,3])
# 返回: [1, 3, 4, 5, 6, 8, 35]
标签:__,arr,right,list,len,快排,冒泡,left
From: https://www.cnblogs.com/xiuneng/p/16841104.html