选择排序算法

a=[34,56,1,2,3,8,54]

如何让这个列表进行从小到大的排序

排序函数

sorted()

  • 括号当中填写要排序的列表
  • 返回一个已经排序完成的列表
a=[34,56,1,2,3,8,54]
b=sorted(a)	#返回一个新的已经排序好的列表
print(b)

#运行结果
#[1, 2, 3, 8, 34, 54, 56]

新建列表进行排序

新建一个列表B,用于存储已经排序完成的结果

a=[34,56,1,2,3,8,54]
b=[]	#建立一个空列表,用于存储已经排序好的数据

for i in range(len(a)):		#a有多长,就循环多少次
    min1=min(a)				#获取现在a当中的最小值
    a.pop(a.index(min1))	#弹出a当中的最小值
    b.append(min1)			#将最小值放到a当中
print(b)

#result
#[1, 2, 3, 8, 34, 54, 56]

选择排序算法

假设我们现在有这样一个列表:[6,5,1,3,4]

每次从剩下的数值当中选择一个最小的,放在开头的位置

1.第一次排序结果:[1,6,5,3,4]

2.第二次排序结果:[1,3,6,5,4]

3.第三次排序结果:[1,3,4,6,5]

4.第四次排序结果:[1,3,4,5,6]

5.第五次排序结果:[1,3,4,5,6]

如何获得最小值?

a=[34,56,1,2,3,8,54]
min1=a[0]
for i in range(len(a)):
    if a[i]<min1:
        min1=a[i]
        
print(min1)
#result
#1

如何从列表当中取出值?

index()

  • 括号当中传入列表值,获得值的索引

pop()

  • 括号当中插入索引值,从列表中删除元素

如何添加元素到列表中?

insert()

  • 括号当中传入索引和值,在索引位置插入这个值
a=[34,56,1,2,3,8,54]

for j in range(len(a)):			#有多个数,就要循环多少次
	minindex=j
	for i in range(j,len(a)):	#内层循环用于获取最小值的索引
	    if a[i]<=a[minindex]:
	        minindex=i
	minNumber=a.pop(minindex)	#弹出最小值
	a.insert(0,minNumber)		#将最小值插入到开头

print(a)

#result
#[56, 54, 34, 8, 3, 2, 1]

元素交换

经典交换案例

代码实现

A=4
B=5

temp=A	#进行交换
A=B
B=temp

print(A,B)	#result:5, 4

我们可以对选择算法进行优化

a=[34,56,1,2,3,8,54]

for j in range(len(a)):			#有多个数,就要循环多少次
	minindex=j
	for i in range(j,len(a)):	#内层循环用于获取最小值的索引
	    if a[i]<=a[minindex]:
	        minindex=i
	# minNumber=a.pop(minindex)	#弹出最小值
	# a.insert(0,minNumber)		#将最小值插入到开头
	temp=a[minindex]
	a[minindex]=a[j]
	a[j]=temp

print(a)
# result
# [1, 2, 3, 8, 34, 54, 56]

另外一种交换方法

A=4
B=5
A,B=B,A
print(A,B)

# result
# 5, 4

封装为通用方法

采用函数方式进行封装

a=[34,56,1,2,3,8,54]
b=[45,12,23,56,34,5]
def sort_funtion(List):				#定义排序函数
    a=List							#复制一个列表出来,不改变原来的列表
	for j in range(len(a)):			#有多个数,就要循环多少次
		minindex=j
		for i in range(j,len(a)):	#内层循环用于获取最小值的索引
		    if a[i]<=a[minindex]:
		        minindex=i
		temp=a[minindex]			#元素交换
		a[minindex]=a[j]
		a[j]=temp
	return a
print(sort_funtion(a))		#调用函数
print(sort_funtion(b))		#调用函数

综合练习

1.我们在这节课中学习了如何进行排序,那么,你能否把这排序的过程动态展示出来呢? 请尝试编写这样一个程序:利用海龟库,首先展示一个没有排好序的列表b,然后手动输入想要交换的元素的索引值,交换两个元素以达到排序的目的(最终与列表a的内容一致)。只有手动成功排序后程序才会结束,否则无限循环尝试,让使用者体验排序的过程。

import turtle

pen=turtle.Pen()
pen.pensize(4)

def sort_funtion(c):				#定义排序函数
	a=[]
	for i in range(len(c)):
		a.append(c[i])

	for j in range(len(a)):			#有多个数,就要循环多少次
		minindex=j
		for i in range(j,len(a)):	#内层循环用于获取最小值的索引
		    if a[i]<=a[minindex]:
		        minindex=i
		temp=a[minindex]			#元素交换
		a[minindex]=a[j]
		a[j]=temp
	return a

#定义一个画图函数,接受一个列表作为参数
def drawing(a):
	for i in range(len(a)):

		pen.setheading(90)		#绘制
		pen.forward(a[i]*3)

		pen.setheading(270)		#回到原来的位置
		pen.forward(a[i]*3)

		pen.penup()				#移动画笔位置,准备后面的绘制
		pen.setheading(0)
		pen.forward(20)
		pen.pendown()

	pen.penup()					#画完一个列表之后,准备下一次绘制
	pen.setheading(0)
	pen.forward(50)
	pen.pendown()

def main():
	List=[45,12,23,56,34,5]
	print("需要排序的列表:",List)
	List_complete=sort_funtion(List)	#对列表进行排序
	drawing(List)
	while List_complete!=List:
		number1=int(input("需要交换的索引:"))
		number2=int(input("需要交换的索引:"))
		List[number2],List[number1]=List[number1],List[number2]
		drawing(List)
		print("现在的列表:",List)
	print("排序完成")
	turtle.down()
main()
Made with Slides.com