lst = [4, 3, 6, 9, 2, 1]
1、冒泡排序: 依次把最大的数字往后移动
def bubble_sort(lst):
for i in range(len(lst) - 1):
for j in range(len(lst) - 1 - i):
if lst[j + 1] < lst[j]:
lst[j + 1], lst[j] = lst[j], lst[j + 1]
return lst
print(bubble_sort(lst))
2、选择排序: 把最小的元素放到最前面
def select_sort(lst):
for i in range(len(lst) - 1):
minindex = i
for j in range(i + 1, len(lst)):
if lst[j] < lst[minindex]:
minindex = j
lst[i], lst[minindex] = lst[minindex], lst[i]
return lst
print(select_sort(lst))
3、 插入排序:把需要插入的数字插入到已经排好序的正确位置,插入的时候只需要比较插入元素之前的值。
def insert_sort(lst):
for i in range(len(lst) - 1):
cur, preindex = lst[i + 1], i
while preindex >= 0 and cur < lst[preindex]:
lst[preindex + 1] = lst[preindex]
preindex -= 1
lst[preindex + 1] = cur
return lst
print(insert_sort(lst))
4、希尔排序:一种更高效的插入排序,它与插入排序的不同之处在于,它会优先比较距离较远的元素。
def shell_sort(lst):
l = len(lst)
gap = 1
while gap < l // 3:
gap = gap * 3 + 1
while gap > 0:
for i in range(gap, len(lst)):
cur, preindex = lst[i], i - gap
while preindex >= 0 and cur < lst[preindex]:
lst[preindex + gap] = lst[preindex]
preindex -= gap
lst[preindex + gap] = cur
gap //= 3
return lst
print(shell_sort(lst))
5、计数排序:开辟一个新的空间,然后把它的数组值当做键,数组中的元素为该值出现的次数。
def counter_sort(lst):
bucket = [0] * (max(lst) + 1)
for l in lst:
bucket[l] += 1
i = 0
for j in range(len(bucket)):
while bucket[j] > 0:
bucket[j] -= 1
lst[i] = j
i += 1
return lst
print(counter_sort(lst))
6、 快速排序:取一个中心点,把比它大的放一边,小的放另一边
def quick_sort(lst):
if len(lst) <= 1:
return lst
p = lst[0]
left = [lst[i] for i in range(1, len(lst)) if lst[i] < p]
right = [lst[i] for i in range(1, len(lst)) if lst[i] >= p]
return quick_sort(left) + [p] + quick_sort(right)
print(quick_sort(lst))
7、 归并排序:将数组平均分为两份,然后各自排序,然后合并到一个新的数组中。
def merge_sort(lst):
if len(lst) <= 1:
return lst
def merge(left, right):
res = []
i = j = 0
while i < len(left) and j < len(right):
if left[i] < right[j]:
res.append(left[i])
i += 1
else:
res.append(right[j])
j += 1
return res + left[i:] + right[j:]
mid = len(lst) // 2
left = merge_sort(lst[:mid])
right = merge_sort(lst[mid:])
return merge(left, right)
print(merge_sort(lst))
8、二分查找:取数组中间的值和查找的值作比较,从而判断需要查找的元素在中间值的哪个方位。
def binary_search(lst,left,right, num):
if right <left:
return -1
mid = (left + right) // 2
if lst[mid] < num:
left = mid + 1
elif lst[mid] > num:
right = mid - 1
else:
return mid
return binary_search(lst,left,right,num)
print(binary_search(lst, 1,len(lst),11))