快排,冒泡,插入,二分

import random

# 二分
def binary_search(li, val):
low = 0
high = len(li)-1
while low <= high:
mid = (low + high) // 2
if li[mid] < val:
low = mid + 1
elif li[mid] > val:
high = mid - 1
else:
return mid
return None

# 快排

def partition(li, left, right):
i = random.randint(left, right)
li[left], li[i] = li[i], li[left]

tmp = li[left]
while left < right:
# 从右边找比tmp小的数
while left < right and li[right] >= tmp:
right -= 1
li[left] = li[right]
# 从左边找比tmp大的数
while left < right and li[left] <= tmp:
left += 1
li[right] = li[left]
li[left] = tmp
return left


def _quick_sort(li, left, right):
if left < right: # 表示至少两个元素
mid = partition(li, left, right)
_quick_sort(li, left, mid-1)
_quick_sort(li, mid+1, right)

# li = list(range(100))
# random.shuffle(li)
# _quick_sort(li, 0, len(li)-1)
# print(li)

# 冒泡
def bubble_sort(li):
for i in range(len(li)-1): # i表示第i趟,共n-1趟
# 第i趟 无序区范围 0~n-i-1
for j in range(len(li)-i-1): # j表示箭头
if li[j] > li[j+1]:
li[j], li[j+1] = li[j+1], li[j]

# li = list(range(100))
# random.shuffle(li)
# bubble_sort(li)
# print(li)

# 插入
def insert_sort(li):
for i in range(1, len(li)):
# i 表示趟数 还表示摸到牌的位置
j = i - 1
tmp = li[i]
while j >= 0 and li[j] > tmp:
# 两个终止条件: 1. j==-1 2. j位置的值小于等于tmp
li[j+1] = li[j]
j -= 1
li[j+1] = tmp

# li = list(range(100))
# random.shuffle(li)
# insert_sort(li)
# print(li)

猜你喜欢

转载自www.cnblogs.com/luchenhui/p/10069158.html
今日推荐