# 选择排序
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 修改为这个公式即可,一般来说插值查找比二分查找更快速,循环次数更少,但是对于很不规整的数据来说并不一定有二分查找好用。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)