python 几种排序方法与二分查找

# 选择排序
def selectionSort(arr):
    # -1 虽然有n个数字 但是没有第n轮 最多n-1轮
    for i in range(0,len(arr) - 1):
        for j in range(i + 1, len(arr)):
            if arr[i] > arr[j]:
                arr[i],arr[j] = arr[j],arr[i]
    print(arr)
# 冒泡排序
def bubbleSort(arr):
    # -1 虽然有n个数字 但是没有第n轮 最多n-1轮
    for i in range(0,len(arr) - 1):
        # -1 是预留出一个元素j+1
        for j in range(0,len(arr) - i - 1):
            if arr[j] > arr[j + 1]:
                arr[j],arr[j + 1] = arr[j + 1],arr[j]
    print(arr)
# 插入排序
def insertionSort(arr):
    for i in range(1, len(arr)) :
        j = i
        while j > 0 and arr[j - 1] > arr[j]:
            arr[j - 1], arr[j] = arr[j], arr[j - 1]
            j -= 1
    print(arr)
# 计数排序
def countingSort(arr):
    # 找到最大值和最小值
    minNum = min(arr)
    maxNum = max(arr)
    # 计算temp列表的长度
    length = maxNum - minNum + 1
    # 创建temp列表(注意 默认都是0)
    temp = [0] * length
    # 遍历arr 将数字出现的次数统计在temp中
    for num in arr:
        temp[num - minNum] += 1
    # 遍历temp 按照每个数字出现的次数 将数字打印出来
    # 因为temp中角标是有序的 所对应的数字也是有序的!
    k = 0
    for index in range(0,len(temp)):
        while temp[index] > 0:
            # 此时打印的顺序 就是一个有序的
            # 打印的次数和数字的个数是一样的
            arr[k] = index + minNum
            k += 1
            temp[index] -= 1
    print(arr)


def getIndex(num, r):
    result = 0
    for i in range(1, r + 1):
        result = num % 10
        num = num // 10
    return result
# 基数排序
def radixSort(arr):
    # 先找最大值 确定 分类-整理 的轮数
    radix = len(str(max(arr)))
    # 需要十个桶(十个列表) 分别表示十进制数字分类
    # temps = [[]] * 10  # 错误的! 将[]的地址重复了10次 不是copy
    """"
    temps = [None] * 10
    for i in range(0,len(temps)):
        temps[i] = []
    """
    temps = []
    for i in range(0,10):
        temps.append([])
    # 按照轮数开始 分类-整理
    # 假设radix是3 3表示最大值是3位数、要搞3轮
    # r = [1,2,3] 1-求个位  2-求十位  3-求百位 .... 以此类推
    for r in range(1 , radix + 1):
        # 先分类
        for num in arr:
            # getIndex:求num这个数字的r位是几 对应temps中的角标
            temps[getIndex(num, r)].append(num)
        # 后整理 
        # 整理到arr中 arr就作为下一轮的源数据了
        k = 0
        for temp in temps:
            while len(temp) > 0:
                arr[k] = temp[0] 
                k += 1
                del temp[0]
    print(arr)
        
            
arr1 = [-2,9,2,3,7,7,-1,0,0,4,9,3,6,-2,-1,-8,7,5]
arr2 = arr1.copy()
arr3 = arr1.copy()
arr4 = arr1.copy()
selectionSort(arr1)
bubbleSort(arr2)
insertionSort(arr3)
countingSort(arr4)
arr5 = [12,23,34,67,123,345,234,7,5,3,50,49,8]
radixSort(arr5)

二分查找

# 二分查找
def binarySearch(arr,key):
    min_index = 0
    max_index = len(arr) - 1
    mid_index = (min_index + max_index) // 2
    while arr[mid_index] != key:
        if arr[mid_index] < key:
            min_index = mid_index + 1
        else:
            max_index = mid_index - 1
        if min_index > max_index:
            return -1
        mid_index = (min_index + max_index) // 2
    return mid_index
arr = [1,2,3,4,5,6,7,8,9,10,11,12]
print(binarySearch(arr,12))
print(binarySearch(arr,1))
print(binarySearch(arr,10.5))

插值查找

二分查找的优化版本,二分查找主要是按照位置来进行划分的,插值查找主要看数据相对而言的靠前或靠后的位置来进行划分(key - min)/(max - min) * indexRange 只需要将mid_index 修改为这个公式即可,一般来说插值查找比二分查找更快速,循环次数更少,但是对于很不规整的数据来说并不一定有二分查找好用。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值