1.二分查找
def half_search(list,num):
n =len(list)
# 确定要查找的范围的起始索引和结束索引
start = 0
end = n-1
while end >= start:
mid = (start + end) // 2
# 如果中位数大于查询的数,说明该查找的数在中位数的左边
if list[mid] > num:
end = mid-1
# 如果中位数小于查询的数,说明该查找的数在中位数的右边,需要缩小查询的范围
elif list[mid] < num:
start = mid + 1
else:
print('查到了,索引为{}'.format(mid))
break
# 如果查找end和start不正常 就是不存在这个数
else:
print('查无此数')
if __name__ == '__main__':
list=[1,2,3,4,5,6,7,8,9]
num = int(input('请输入要查找数:'))
half_search(list,num)
2.冒泡排序
冒泡排序就是每次从一个列表中比出一个最大值,然后再在剩下的列表中比较拿出最大值,依次下去呈现的状况就是大的数往一个方向‘冒’
def bubble_sort(list):
# 每次循环比较的次数依次减少,第一轮比较的次数为列表长度减一
for i in range(len(list)-1,0,-1):
# 第一轮比较len(list)-1 次,下一轮比较的次数减一,因为最大的数已经拿出,不再参与比较
for j in range(i):
# 如果左边的大于右边的,互换位置
if list[j] > list[j+1]:
list[j],list[j+1]=list[j+1],list[j]
return list
list = [1,5,3,6,2]
print(bubble_sort(list)) #[1, 2, 3, 5, 6]
3.插入排序
插入排序(英语:Insertion Sort)是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上,在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间。
# 插入排序
def insertsort(list):
for i in range(1,len(list)):
j = i-1
if list[i] < list[j]:
list[j],list[i] = list[i],list[j]
j = j -1 # 将索引提前一个,和前面的数进行比较
while j>=0 and list[j] >list[j+1]: # 循环和前面的数进行比较
list[j],list[j+1] = list[j+1],list[j]
j =j -1
s = [1,5,6,2,3,1,8,4,5,2,9]
insertsort(s)
print(s) # [1, 1, 2, 2, 3, 4, 5, 5, 6, 8, 9]
4.选择排序
选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理如下。首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。
选择排序的主要优点与数据移动有关。如果某个元素位于正确的最终位置上,则它不会被移动。选择排序每次交换一对元素,它们当中至少有一个将被移到其最终位置上,因此对n个元素的表进行排序总共进行至多n-1次交换。在所有的完全依靠交换去移动元素的排序方法中,选择排序属于非常好的一种。
# 选择排序
def findsamll(list):
small_one = list[0]
small_index = 0
for i in range(1,len(list)): # 当列表长度只有1时直接跳过 返回 最小值索引0
if list[i] < small_one:
small_one = list[i]
small_index = i
return small_index
def select_sort(list):
new_list = []
for i in range(len(list)):
small_index = findsamll(list) # 每次循环找出最小值的索引,弹出添加到新列表
new_list.append(list.pop(small_index))
return new_list
list = [1,5,6,2,3,1,8,4,5,2,9]
print(select_sort(list)) # [1, 1, 2, 2, 3, 4, 5, 5, 6, 8, 9]
5.快速排序
快速排序(英语:Quicksort),又称划分交换排序(partition-exchange sort),通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
步骤为:
⑴从数列中挑出一个元素,称为"基准"(pivot),
⑵重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区结束之后,该基准就处于数列的中间位置。这个称为分区(partition)操作。
⑶递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。
递归的最底部情形,是数列的大小是零或一,也就是永远都已经被排序好了。虽然一直递归下去,但是这个算法总会结束,因为在每次的迭代(iteration)中,它至少会把一个元素摆到它最后的位置去。
def quick_sort(list):
if len(list)<2: # 如果列表元素个数小于2,直接返回列表即可
return list
else:
privot = list[0]
same = [i for i in list if i == privot] # 如果有重复的数不会去重
less = [i for i in list if i < privot] # 比基准值小的数,放左边
greater = [i for i in list if i > privot] # 比基准值大的数,放右边
return quick_sort(less) + same + quick_sort(greater) # 递归对左边和右边的数进行排序
list = [1, 2, 3, 1, 5, 6, 2, 3]
print(quick_sort(list)) # [1, 1, 2, 2, 3, 3, 5, 6]