程序员面试算法宝典-8.1~8.8 选择排序、插入排序 、冒泡排序、 归并排序、 快速排序、 希尔排序、 堆排序、 基数排序

# 选择排序
def select_sort(lists):
    count = len(lists)
    for i in range(0, count):
        min = i
        for j in range(i+1, count):
            if lists[min]>lists[j]:
                min = j
        lists[i], lists[min] = lists[min], lists[i]
    return lists

# 插入排序
def insert_sort(lists):
    count = len(lists)
    # 遍历列表后面未排序的数
    for i in range(0, count):
        key = lists[i]
        # 选取未排序的一个数与以排序完成的列表进行插入排序
        j = i - 1
        while j>=0:
            if lists[j]>key:
                lists[j+1] = lists[j]
                lists[j] = key
            j -= 1
    return lists
# 冒泡排序
def bubble_sort(lists):
    count = len(lists)
    for i in range(0, count):
        for j in range(i+1, count):
            if lists[i]>lists[j]:
                lists[i], lists[j] = lists[j], lists[i]
        print(lists)
    return lists
# 归并排序
def merge(left, right):
    i, j = 0, 0
    result = []
    while i<len(left) and j<len(right):
        if left[i]<=right[j]:
            result.append(left[i])
            i += 1
        else:
            result.append(right[j])
            j += 1
    result += left[i:]
    result += right[j:]
    return result
def merge_sort(lists):
    if len(lists)<=1:
        return lists
    num = len(lists)//2
    left = merge_sort(lists[:num])
    right = merge_sort(lists[num:])
    return merge(left, right)
# 快速排序
def quick_sort(lists, left, right):
    if left>right:
        return lists
    key = lists[left]
    low = left
    high = right
    while left<right:
        # 从右开始扫描,如果值大于key则right-1,小于key则交换
        while left<right and lists[right]>=key:
            right -= 1
        lists[left] = lists[right]
        # 从左开始扫描,如果值小于key则left+1,大于key则交换
        while left<right and lists[left]<=key:
            left += 1
        lists[right] = lists[left]
    lists[right] = key
    quick_sort(lists, low, left-1)
    quick_sort(lists, left+1, high)
    return lists
# 希尔排序
def shell_sort(lists):
    count=len(lists)
    step = 2
    group = count//step
    while group>0:
        for i in range(0, group):
            j = i + group
            while j<count:
                k = j-group
                key = lists[j]
                while k>=0:
                    if lists[k]>key:
                        lists[k+group]=lists[k]
                        lists[k] = key
                    k -= group
                j += group
        group = group//step
    return lists
# 堆排序
# import sys
# sys.setrecursionlimit(10000)
def adjust_heap(lists, i, size): # i:结点 size:堆的大小
    lchild = 2*i + 1 # 左孩子
    rchild = 2*i + 2 # 右孩子
    maxs = i
    if i<(size//2):
        if lchild<size and lists[lchild]>lists[maxs]:
            maxs = lchild
        if rchild<size and lists[rchild]>lists[maxs]:
            maxs = rchild
        if maxs!=i:
            lists[maxs], lists[i] = lists[i], lists[maxs]
            adjust_heap(lists, maxs, size)
def build_heap(lists, size):
    for i in range(0, (size//2))[::-1]:
        adjust_heap(lists, i, size)
def heap_sort(lists):
    size = len(lists)
    build_heap(lists, size)
    for i in range(0, size)[::-1]:
        lists[0], lists[i] = lists[i], lists[0]
        adjust_heap(lists, 0, i)

# 基数排序
import math
def radix_sort(lists, radix=10):
    k = int(math.ceil(math.log(max(lists), radix)))
    bucket = [[] for i in range(radix)] # []列表10个,表示10个桶
    for i in range(1, k+1):
        for j in lists:
            bucket[j//(radix**(i-1))%(radix**i)].append(j)
        del lists[:]
        for z in bucket:
            lists += z
            del z[:]
    return lists
def radix_sort1(s):
    """基数排序"""
    i = 0 # 记录当前正在排拿一位,最低位为1
    max_num = max(s)  # 最大值
    j = len(str(max_num))  # 记录最大值的位数
    while i < j:
        bucket_list =[[] for _ in range(10)] #初始化桶数组
        for x in s:
            bucket_list[int(x / (10**i)) % 10].append(x) # 找到位置放入桶数组
        s.clear()
        for x in bucket_list:   # 放回原序列
            for y in x:
                s.append(y)
        i += 1
    print(s)

if __name__=="__main__":
    lists=[3, 4, 2, 8, 9, 5, 1]
    print("排序前序列为:")
    for i in lists:
        print(i, end=" ")
    print("\n排序后序列为:")
    radix_sort1(lists)

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值