文章目录
一.冒泡排序
冒泡排序是一种简单的排序算法,它重复地遍历要排序的列表,比较相邻的两个元素,如果顺序不正确就交换它们。通过多次遍历,将最大或最小的元素逐步“冒泡”到列表的一端,最终实现整个列表的排序。
相邻元素比较原理:每轮比较都是从0号元素与1号元素开始比较,1号与2号元素比较,依次类推,每轮比较就会确定一个最值放到末尾,因此每轮比较元素的索引号会随着轮次递减。
def Bubble_Sort(ls):
#外循环变量 i 代表第几轮内循环比较,每轮确定最大值放到末尾
for i in range(1,len(ls)): #列表中有5个元素,只需要比较4次即可
#内循环 j 代表索引号;
#末尾的元素已确定为最大值,无需再次比较,第一轮四个元素之间比较...第四次只有两个元素比较,比较元素的索引号应随着i增大而递减
for j in range(0, len(ls)-i):
#两两比较,若满足条件,则交换位置
if ls[j] > ls[j+1]:
#两者交换位置,较小者右移
ls[j+1],ls[j] = ls[j],ls[j+1]
#调用冒泡排序函数
ls = [44,56,65,34,1]
Bubble_Sort(ls)
print("冒泡排序后的顺序是:",ls)
二.选择排序
选择排序是一种简单的排序算法,它的基本思想是首位元素与剩余元素比较,小于/大于首位元素则与首位元素交换位置,每一次从待排序的序列中选择最值元素,放到已排序序列的末尾,直到整个序列排序完成。
演示案例:每次外循环确定最值置于末尾,内循环首位元素与其余元素比较
def Selection_Sort(ls):
#外循环 i 代表首元素索引号,每轮外循环结束确定一个最大值放在末尾
for i in range(1,len(ls)-1):
#内循环 j 代表与首元素比较元素的索引号
for j in range(i, len(ls)):
#若首位元素<比较元素
if ls[i-1] > ls[j]:
#两者交换位置,较小者左移
ls[j],ls[i-1] = ls[i-1],ls[j]
#调用冒泡排序函数
ls = [44,56,65,34,1]
Selection_Sort(ls)
print("选择排序后的顺序是:",ls)
三.插入排序
入排序是一种简单的排序算法,其工作原理是将一个元素插入到已经排序好的元素序列中的适当位置,然后将插入的元素与其前面的元素相比较,较小者职业末尾
演示案例:每次外循环确定最值,内循环控制插入元素,每执行一次外循环插入一个元素
def insertion_sort(ls):
# i 代表插入元素索引号,此处默认将0号元素作为已排序好的元素,即从1号索引元素开始插入
for i in range(1, len(ls)):
key = ls[i] #将插入的元素保存到变量key中
j = i - 1 # j代表插入元素的前一个元素索引号,即当前插入元素的前面的元素都是已排序好的元素
while j>=0 and ls[j] > key: #此循环用于遍历已排序元素并与插入元素比较
ls[j + 1] = ls[j] #较大元素右移
j -= 1 #将索引向前移动一位
ls[j + 1] = key #内循环结束,找到了插入元素的位置,将元素插入对应位置
ls=[5, 3, 8, 6, 7]
insertion_sort(ls)
print(ls)
四.计数排序
计数排序的基本思想是以原数组中筛选出的最值为范围的起点和终点【range(min,max)】,根据生成的范围遍历出一个新的数组与原数组比较,最后统计新数组每个元素在原数组中出现的次数,根据出现次数来确定元素的位置。
def counting_sort(arr):
# 找到数组中的最大值
max_value = max(arr)
# 创建一个计数数组,长度为最大值加1
count = [0] * (max_value + 1)
# 统计每个元素出现的次数
for num in arr:
count[num] += 1
# 根据计数数组重新排序原数组
sorted_arr = []
for i in range(len(count)):
sorted_arr.extend([i] * count[i])
return sorted_arr
# 测试案例
arr = [4, 2, 5, 1, 3, 4, 7, 2, 5, 1, 3]
sorted_arr = counting_sort(arr)
print(sorted_arr)
五.二分查找
二分查找是一种常用的查找算法,它可以在有序的列表中快速定位指定的元素。该算法的基本思想是将列表分成两半,将查找元素与其中一半列表中位数比较,然后确定待查找元素位于哪一半中,然后再在该半部分中继续进行二分查找。通过每次将待查找范围缩小一半,二分查找算法能够在很短的时间内找到目标元素。
二分查找的前提是数组中的元素已经按照升序/降序排列。如果数组没有排序,就需要先对数组进行排序,才能使用二分查找算法。
演示案例:
#升序函数
def Selection_Sort(ls):
#每次外循环确定最小者置于末尾
for i in range(1,len(ls)):
#内循环控制与首位元素比较的元素
for j in range(i, len(ls)):
#若首位元素<比较元素
if ls[i-1] > ls[j]:
#两者交换位置,较小者右移
ls[j],ls[i-1] = ls[i-1],ls[j]
def binary_search(ls, num):
# 初始化查找范围的起点和终点,即列表的起始和结束位置
begin = 0
end = len(ls) - 1
# 使用while循环进行查找,只要起点小于等于终点就继续查找
while begin <= end:
# 计算当前查找范围的中间位置(中位数)的索引
mid = (begin + end) // 2
# 如果列表中间位置的元素大于要查找的数,则调整查找范围为左半部分
if ls[mid] > num:
end = mid - 1
# 如果列表中间位置的元素小于要查找的数,则调整查找范围为右半部分
elif ls[mid] < num:
begin = mid + 1
# 如果列表中间位置的元素就是要查找的数,则打印其索引并退出循环
else:
print(f"查找的数字{num}的序号是:", mid)
break
# 定义要查找的列表
ls = [44,56,65,34,1]
# 从用户那里获取需要查找的整数
num = int(input("请输入需要查找的整数:"))
#调用升序函数
Selection_Sort(ls)
# 调用二分查找函数
binary_search(ls, num)