排序算法

排序算法

快速排序

'''
快排原理:
1. 选定一个中间值,默认是第一个值
2. 将小于这个中间值的数据放到左边
3. 将大于等于这个中间值的数据放到右边
4. 然后循环调用
5. 终止条件:列表中只剩一个元素时
'''
def sortq(lst):
    if len(lst) >= 2:
        mid = lst[0]
        left = []
        right = []
        lst.remove(mid)
        for i in lst:
            if i < mid:
                left.append(i)
            else:
                right.append(i)
        # print(left+[mid]+right)
        return sortq(left) + [mid] +sortq(right)
    else:
        return lst

if __name__ == '__main__':
    lst = [10, 7, 8, 9, 1, 5, 8]
    print(sortq(lst))

选择排序

'''
选择排序:
原理:选定一个值为最小值,默认是第一个数字,后面的数字依次与这个值作比较,直到选出最小的放到最前面
1. 选择默认值作为第一个最小值
2. 进行筛选,筛选出最小值记录坐标和数值,与开头的数字交换位置
3. 循环筛选
'''
def sortc(lst):
    for j in range(len(lst)):
        min = lst[j]
        index = j # 记录坐标
        for i in range(j+1,len(lst)):
            if min > lst[i]:
                min = lst[i]
                index = i
        lst[j],lst[index] = min,lst[j]
    return lst

if __name__ == '__main__':
    lst = [10, 7, 8, 9, 1, 5, 8]
    print(sortc(lst))

插入排序

'''
插入排序:
原理:从第二个值开始,依次与前面的值做比较,谁小,谁排在前面
'''
def sortiASC(lst):
    for i in range(1,len(lst)):
        for j in range(i-1,-1,-1):
            if lst[j+1] < lst[j]:
                lst[j+1],lst[j] = lst[j],lst[j+1]
            else:
                break
    return lst

def sortiDesc(lst):
    for i in range(len(lst)-2,-1,-1):
        for j in range(i,len(lst)-1):
            if lst[j] < lst[j+1]:
                lst[j + 1], lst[j] = lst[j], lst[j + 1]
            else:
                break
    return lst

if __name__ == '__main__':
    lst = [10, 7, 8, 9, 1, 5, 8]
    print(sortiASC(lst))
    print(sortiDesc(lst))

希尔排序

'''
希尔排序:
原理:三层循环
1. 判断步长是否为0,为0则排序完毕
2. 步长为起始下标,确定临时值和同组的下标
3. 同组比较,下标>=0,且前面的值大于后面的值,就将大的值插到后面的位置
'''

def sortShell(lst):
    n = len(lst)
    mid = int(n/2)
    while mid > 0:
        for i in range(mid,n):
            temp = lst[i]
            j = i-mid
            while j >= 0 and lst[j] > temp:
                lst[j+mid] = lst[j]
                j -= mid
            lst[j+mid] = temp
        mid = int(mid/2)
    return lst
if __name__ == '__main__':
    lst = [10, 7, 8, 9, 1, 5, 8]
    print(sortShell(lst))

归并排序

'''
归并排序:
1. 将列表不断分成两组,直到长度为1
2. 比较两个列表的值的大小,小的放在前面
3. 在分组进行到最后的时候,会进行排序
'''
def sortMerge(lst):
    if len(lst) <= 1:
        return lst
    num = int(len(lst)/2)
    left = sortMerge(lst[:num])
    right = sortMerge(lst[num:])
    return merge(left,right)

def merge(left,right):
    r,l = 0,0
    result = []
    while l < len(left) and r < len(right):
        if left[l] <= right[r]:
            result.append(left[l])
            l += 1
        else:
            result.append(right[r])
            r += 1
    result += list(left[l:])
    result += list(right[r:])
    return result

if __name__ == '__main__':
    lst = [10, 7, 8, 9, 1, 5, 8]
    print(sortMerge(lst))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值