冒泡排序、快速排序、插入(直接插入)排序、二分搜索算法–python版
冒泡排序
冒泡排序:
例如 一个数组
[5,10,6,7,4,5,9] 要求从小到大排序
第一轮,从第一个数字开始往后遍历数组,和后一个数字比较,如果前一个大于后一个,就交换位置,让比较大的那个数字继续和后面的数字进行比较,直到最后就得到这个数组里面最大的数字,放在了数组最后面。
第二轮,和第一轮同理,比较到倒数第二个数字停,这就是数组中第2大的数字。
循环往复,就得到从小到大排好序的数组了。
代码如下:
# 将列表中数字按照从小到大排列
# 冒泡排序,多轮排序
nums = [10,30,60,90,100,80,70,40,20,50]
for i in range(1,len(nums)):
for j in range(len(nums)-i):
if nums[j]>nums[j+1]:
nums[j],nums[j+1] = nums[j+1],nums[j]
for item in nums:
print(item)
快速排序
快速排序:
例如一个数组:
[5,10,6,7,4,5,9] 要求从小到大排序
首先选一个基准(随便),先将基准移出数组(原因:如果列表中有两个及以上和基准相同的项,就会造成right数组的长度一直>1,造成死循环),设置两个数组分别为left[]和right[],遍历数组,将所有的值和基准进行比较,比基准小的放left,大的放right,递归调用,当数组长度小于2,返回改数组,否则返回left+[mid]+right。
代码如下:
# 将如下数组按照从小到大排序
# 快速排序,分左右两区,选基准
# 之所以要移出基准,是防止有很多和基准相同的值存在
def quick_sort(b):
"""快速排序"""
if len(b) < 2:
return b
# 选取基准,随便选哪个都可以,选中间的便于理解
mid = b[len(b) // 2]
# 定义基准值左右两个数列
left, right = [], []
# 从原始数组中移除基准值
b.remove(mid)
for item in b:
# 大于基准值放右边
if item >= mid:
right.append(item)
else:
# 小于基准值放左边
left.append(item)
# 使用迭代进行比较
return quick_sort(left)+ [mid] +quick_sort(right)
b = [10,30,40,60,22,50]
a = quick_sort(b)
print(a)
插入排序(快速插入)
插入排序:
例如一个数组:
[5,10,6,7,4,5,9] 要求从小到大排序
遍历数组,每个数要是比自己前面的数字小,就换位置,换到合适为止,
然后再看下一个数字位置是否恰当。
和冒泡排序的区别就是:冒泡排序没有锁定一个数,而是锁定最大(比较者)比较小的那个数,插入排序是锁定一个数字,把他放到合适的位置。
代码如下:
# 将如下数组按照从小到大排序
# 插入也叫快速插入
def quick_insert(nums):
for item in range(len(nums)):
while item - 1 >=0 and nums[item] < nums[item-1]:
nums[item],nums[item-1] = nums[item-1],nums[item]
item -= 1
return nums
nums = [10,40,30,20,50,60,90,80,100,40]
print(quick_insert(nums))
二分搜索
二分搜索:
例如一个数组:
[5,10,6,7,4,5,9] 要找到某个数字flag
首先就是排序!!!!!!
排序完成后,选中间数mid,通过比较,如果mid和flag相等,返回True,找到,如果不相等,比mid小,从mid左边找,相反从右边找。
代码如下:
def binary_search(alist,item):
n=len(alist)
if n>0:
mid = n // 2 #找到中间值
if alist[mid]==item:
return True #证明中间值就是要找的值
elif alist[mid]<item:
return binary_search(alist[mid+1:],item) #在中间值的右侧是目标值,按照递归的思想进行调用函数
else:
return binary_search(alist[:mid],item) #在中间值的左侧是目标值,按照递归的思想进行调用函数
return False
# 如果想要知道最后查到的结果的位置,可以返回所有的mid,计算mid1 + (mid2-mid1)
num = [10,30,60,66,69,80,90,101]
print(binary_search(num,66))