排序
排序(Sort)是将无序的记录序列(或称文件)调整成有序的序列。排序方法有很多种,下面举例说明:
冒泡排序
冒泡排序是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。
示例:
list_data = [8, 9, 6, 5, 7, 4, 1, 2, 3]
# 冒泡排序
def bubbling_sort(data):
for i in range(len(data) - 1):
for j in range(i + 1, len(data)):
# 从头开始,每取一个元素都和后面的所有元素相比
if data[i] > data[j]:
data[i], data[j] = data[j], data[i]
快速排序
从数列中挑出一个元素,称为 "基准"(pivot),重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作。 递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。
示例:
list_data = [8, 9, 6, 5, 7, 4, 1, 2, 3]
def sub_sort(data, low, high):
# 将第一个值作为基础值备份出来
key = data[low]
while low < high:
# 从后面开始将小于基础值的元素往前移动到最前面
while low < high and data[high] > key:
high -= 1
data[low] = data[high]
# 从前面开始将大于基础值的元素往后移动到最后面
while low < high and data[low] < key:
low += 1
data[high] = data[low]
# 前后索引集中在一起时结束,将基础值填充进去,并返回所在索引
data[low] = key
return low
def quick(data, low, high):
# low 开头索引
# high 末尾索引
if low < high:
key = sub_sort(data, low, high)
# 将利用基础值分割的左右两部分迭代进行处理,直到结束
quick(data, low, key - 1)
quick(data, key + 1, high)
插入排序
对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入,插入排序在实现上,通常在从后面向前扫描过程中,需要反复把已排序元素逐步向后挪威,为最新元素提供插入空间
示例:
list_data = [8, 9, 6, 5, 7, 4, 1, 2, 3]
def insert_sort(data):
for i in range(1, len(data)):
# 从第二个开始取一个值
x = data[i]
# 当前索引
j = i
# 往前依次找比当前值大的进行交换,直到没有
while j > 0 and data[j - 1] > x:
data[j] = data[j - 1]
j -= 1
# 将取到值插入进去
data[j] = x
选择排序
工作原理为,首先在未排序序列中找到最小元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小元素,然后放到排序序列末尾。以此类推,直到所有元素均排序完毕
示例:
list_data = [8, 9, 6, 5, 7, 4, 1, 2, 3]
def choose_sort(data):
for i in range(len(data) - 1):
# 假定本次是最小
min_index = i
for j in range(i + 1, len(data)):
# 发现后面有比本次还小,则标记它为最小
if data[j] < data[min_index]:
min_index = j
# 如果最小的不是本次最小则交换位置
if min_index != i:
data[i], data[min_index] = data[min_index], data[i]
查找
二分法查找
例如,随机一个1~100中的数,猜一猜数字是几,我们会先猜中数50,如果小了就会接着猜75,如果是大了就会接着猜25,以此类推。
data = [i for i in range(1, 101)]
# 找出指定数据的下标
def search(data, key):
low = 0
high = len(data) - 1
while low <= high:
mid = (low + high) // 2
if data[mid] > key:
high = mid - 1
elif data[mid] < key:
low = mid + 1
else:
return mid
return -1
print(search(data, 80))