Python排序和查找
·
一、排序的介绍
- 排序是将多个数据,按照指定的顺序进行排列的过程
- 排序的分类:
- 冒泡排序
- 选择排序
- 插入排序
- 希尔排序
- 归并排序
- 快速排序
- 堆排序
- 计数排序
- 桶排序
- 基数排序
二、冒泡排序法
- 介绍:
- 冒泡排序(Bubble Sorting)的基本思想是:重复地走访需要排序地元素列表,依次比较两个相邻的元素,如果顺序(如从大到小或从小到大)错误就交换它们的位置。重复地进行直到没有相邻的元素需要交换,则元素列表排序完成
- 在冒泡排序中,值最大(或最小)的元素会通过交换慢慢“浮”到元素列表的“顶端”。就像冒泡一样,所以被称为冒泡排序
- 冒泡排序法案例:
列表:[24,69,80,57,13]有5个元素,使用冒泡排序法将其排成一个从小到大的有序列表 第一轮排序:把最大的数字放到最后 第1次比较:[24,69,80,57,13] 第2次比较:[24,69,80,57,13] 第3次比较:[24,69,57,80,13] 第4次比较:[24,69,57,13,80] 第二轮排序:把第二大的数字放到倒数第二的位置 第1次比较:[24,69,57,13,80] 第2次比较:[24,57,69,13,80] 第3次比较:[24,57,13,69,80] 第三轮排序:把第三大的数字放到倒数第三的位置 第1次比较:[24,57,13,69,80] 第2次比较:[24,13,57,69,80] 第四轮排序:把第四大的数字放到倒数第四的位置 第1次比较:[13,24,57,69,80] - 代码演示:
# 如果只是完成排序功能,我们可以直接使用list的方法sort num_list = [24,69,80,57,13] print("排序前".center(32,"-")) print(f"num_list:{num_list}") # 使用sort方法完成排序 num_list.sort() print("排序后".center(32,"-")) print(f"num_list:{num_list}")my_list = [24,69,80,57,13] """ 第一轮排序:把最大的数字放到最后 第1次比较:[24,69,80,57,13] 第2次比较:[24,69,80,57,13] 第3次比较:[24,69,57,80,13] 第4次比较:[24,69,57,13,80] """ # j变量控制比较的次数,同时可以作为比较元素的索引下标 for j in range(0,4): # 如果前面的元素 > 后面的元素,就交换 if my_list[j] > my_list[j+1]: my_list[j],my_list[j+1] = my_list[j+1],my_list[j] print(my_list) """ 第二轮排序:把第二大的数字放到倒数第二的位置 第1次比较:[24,69,57,13,80] 第2次比较:[24,57,69,13,80] 第3次比较:[24,57,13,69,80] """ for j in range(0,3): # 如果前面的元素 > 后面的元素,就交换 if my_list[j] > my_list[j+1]: my_list[j],my_list[j+1] = my_list[j+1],my_list[j] print(my_list) """ 第三轮排序:把第三大的数字放到倒数第三的位置 第1次比较:[24,57,13,69,80] 第2次比较:[24,13,57,69,80] """ for j in range(0,2): # 如果前面的元素 > 后面的元素,就交换 if my_list[j] > my_list[j+1]: my_list[j],my_list[j+1] = my_list[j+1],my_list[j] print(my_list) """ 第四轮排序:把第四大的数字放到倒数第四的位置 第1次比较:[13,24,57,69,80] """ for j in range(0,1): # 如果前面的元素 > 后面的元素,就交换 if my_list[j] > my_list[j+1]: my_list[j],my_list[j+1] = my_list[j+1],my_list[j] print(my_list) # for i in range(0,4): # for j in range(0,4-i): # if my_list[j] > my_list[j + 1]: # my_list[j], my_list[j + 1] = my_list[j + 1], my_list[j] # print(my_list)
三、查找
(1)基本介绍
在Python中,我们应当掌握两种常见的查找方法:
- 顺序查找
- 二分查找
- 插值查找
- 斐波那契查找
- 树表查找
- 分块查找
- 哈希查找
(2)顺序查找
顺序查找案例:白眉鹰王、金毛狮王、紫衫龙王、青翼蝠王,猜名字游戏:从键盘中任意输入一个名称,判断列表中是否包含此名称【顺序查找】。要求:如果找到了,就提示找到,并给出下标值
name_list = ["白眉鹰王","金毛狮王","紫衫龙王","青翼蝠王"]
find_name = "金毛狮王"
# 使用list.index完成查找
find_index = name_list.index(find_name)
# 编写顺序查找函数seq_search
def seq_search(my_list,find_val):
"""
功能:顺序查找指定的元素
:param my_list: 传入的列表(即要查找的列表)
:param find_val:要查找的值/元素
:return:如果查找到则返回对应的索引下标,否则返回-1
"""
"""
思路分析
1.对列表进行遍历,如果找到了,则返回对应的下标
2.如果遍历结束,没有找到,则返回-1
"""
find_index = -1
# 遍历
for i in range(len(my_list)):
if my_list[i] == find_val:
print(f"恭喜,找到对应的值{find_val} 下标是{i}")
find_index = i
break
else:
print(f"没有找到对应的值 {find_val}")
return find_index
res_index = seq_search(name_list,find_name)
print("res_index:",res_index)
(3)二分查找
- 二分查找案例:请对一个列表(元素是从小到大排序的)进行二分查找[1,8,10,89,1000,1234],输入一个数字看看该列表是否存在这个数,并且求出下标,如果没有就返回-1
num_list = [1, 8, 10, 89, 1000, 1234] def binary_search(my_list, find_val): """ 功能:完成二分查找 :param my_list:要查找的列表(该列表是由大小顺序) :param find_val:要查找的元素/值 :return:如果找到返回对应的下标,如果没有找到,返回-1 """ # left_index:表示左边的索引 # right_index:表示右边的索引 left_index,right_index = 0, len(my_list)-1 # 定义找到数的下标 find_index = -1 # 使用while循环,不断地折半比较 while left_index <= right_index: # 中间数的下标/索引 middle_index = (left_index + right_index) // 2 if my_list[middle_index] > find_val: right_index = middle_index - 1 elif my_list[middle_index] < find_val: left_index = middle_index + 1 else: find_index = middle_index break # 找到一个就退出while return find_index res_index = binary_search(num_list, 1) if res_index == -1: print("没有找到该数") else: print(f"找到数,对应的下标{res_index}") - 二分查找的注意事项和细节:
- 二分查找的前提是该列表已经是一个排好序的列表(从小到大或者从大到小)
- 排列的顺序是从小到大还是从大到小,会影响二分查找的代码逻辑
- 二分查找的思路分析:
- 前提是这个列表是一个排好序的列表(为了分析方便,就以从小到大的列表为例分析)
- 找到列表的中间数 mid_val 和 find_val 比较
- 如果 mid_val > find_val,则到 mid_val 的左边查找
- 如果 mid_val < find_val,则到 mid_val 的右边查找
- 如果 mid_val = find_val,则找到,返回对应的下标即可
- 不断地重复上述步骤,这里就是不断地折半,使用 while
- 如果 while 结束,都没有找到,说明 find_val 没有在列表
四、本章作业
- 随机生成10个整数(1-100的范围)保存到列表,使用冒泡排序,对其进行从大到小排序
# 随机生成10个整数(1-100的范围)保存到列表 # random.randint(a,b):返回随机整数N满足 a<=N<=b import random lst_num = [] for i in range(10): lst_num.append(random.randint(1, 100)) # 使用冒泡排序,对其进行从大到小排序 def bubble_sort(my_list): for i in range(1,len(lst_num)-1): for j in range(0,len(lst_num)-1): if lst_num[j] < lst_num[j+1]: lst_num[j], lst_num[j+1] = lst_num[j+1], lst_num[j] bubble_sort(lst_num) print(lst_num) - 在第一题的基础上,使用二分查找,查找是否有8这个数,如果有,就返回对应的下标。如果没有,就返回-1
# 使用二分查找,查找是否有8这个数,如果有,就返回对应的下标。如果没有,就返回-1 def binary_search(my_list,find_val): find_index = -1 left_index,right_index=0,len(my_list)-1 while left_index <= right_index: middle_index = (left_index + right_index) // 2 if my_list[middle_index] > find_val: left_index = middle_index + 1 elif my_list[middle_index] < find_val: right_index = middle_index - 1 else: find_index = middle_index break return find_index res_index = binary_search(lst_num, 8) if res_index == -1: print("Not Found") else: print(f"找到数,对应的下标{res_index}")
更多推荐


所有评论(0)