作业整理,加上了一些自己的理解
排序 冒泡(bubble)、选择(select)、插入(insert)
import random
ls = [i for i in range(7)] # 生成20个数
random.shuffle(ls) # 打乱列表
print('排序前数据:',ls)
print('数据长度:',len(ls))
1.冒泡排序
- 比较相邻的元素。如果第一个比第二个大,就交换他们两个。
- 对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
- 针对所有的元素重复以上的步骤,除了最后一个。
- 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较
随机一组示例数据【5,2,3,1】
第一次
将【5,2】两个数据进行比较,5>2,交换它们位置,再将【5,3】比较,交换,再将【5,1】比较,交换
【2,3,1,5】,最大的5被拍到了最后
第二次
将【2,3】比较,不用交换,将【3,1】比较,交换位置
【2,1,3,5】
第三次
将【2,1】比较,交换位置
【1,2,3,5】
字符串长度为 | 4 | n |
---|---|---|
循环次数(i,0- n-2) | 3次 | n-1 |
第一(0)次比较了 | 3次 | 4-1-0 |
第二(1)次比较了 | 2次 | 4-1-1 |
第三(2)次比较了 | 1次 | 4-1-2 |
第 i (i-1)次比较了 | n-1-i | |
第 n-1 (n-2)次比较了 | 1 |
def bull_sort(ls):
if len(ls)<=1:
return ls
for i in range(len(ls)-1): # 循环次数
for j in range(len(ls)-1-i):# 比较次数为【长度-1-i】次
if ls[j] > ls[j+1]: # 相邻两个数进行比较
ls[j+1],ls[j] = ls[j],ls[j+1]
return ls
bull=bull_sort(ls)
print('冒泡排序后:',bull)
2.选择排序
先找出最小的数,然后依次进行排序
在未排序的数和已排数进行比较,每轮选出未排中最小的
举个例子:长短不一的小木棒排序,可以先选出最小的那根放好,然后再在剩余的一堆里面找出第二小的,
每一次找到一个最大值或者最小值
找到最小值,再交换
1 5 2 8 9 13 -5
选择升序
假设第一个值最小值
min = ls[0] =1
开始查找真正的最小值
1. -5 5 2 8 9 13 1
2. -5 1 2 8 9 13 5
3. -5 1 2 8 9 13 5
4. -5 1 2 5 9 13 8
5. -5 1 2 5 8 13 9
6. -5 1 2 5 8 9 13
def select_sort(ls):
n=len(ls)
# 如果只有一个数据就不用进行排序了
if n<=1:
return ls
# 进行循环 n-1 次
for i in range(0,n-1):
minindex=i # 假设当前最小值的位置为i
for j in range(i+1,n): # 从当前位置后面一个开始和当前位置进行比较
# 如果后面的数小于当前数,则将最该数位置赋给minindex,再继续用后面数和minindex做比较
if ls[j]<ls[minindex]:
minindex=j
if minindex!=i: # 如果假设的最小值位置i不是最小值,则交换位置i和位置minindex的值
ls[minindex],ls[i]=ls[i],ls[minindex]
return ls
select=select_sort(ls)
print('选择排序后:',select)
3.插入排序
每轮将一个未排序数 插入 已排好的序列
举个列子:一堆长短不一的小木棒,每次从里面取出一个小木棒,然后进行排序
# 每轮将一个未排序数插入已排好的序列
def insert_sort(ls):
n=len(ls)
if n <= 1: # 如果列表中就一个,则直接输出
return ls
for i in range(1,n): # 对列表进行循环,默认第一个数是有序的,将后面的数和第一个数进行比较
j=i # j是用来判断插入次数的
target=ls[i] # 选取要插入的那个数(该数未进行排序)
while j > 0 and target < ls[j-1]: # 第一次是判断target是否小于他前面那个数(该数前面的数都是有序的从小到大排的)
ls[j] = ls[j-i] # 如果小于,则继续向前判断
j = j-1
ls[j] = target # 如果target比他前面那个数大,则位置不变
return ls
insert = insert_sort(ls)
print('插入排序后:',insert)