python算法之排序

作业整理,加上了一些自己的理解

排序 冒泡(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】

字符串长度为4n
循环次数(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-1for 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)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值