Python数据结构与算法—排序和查找
排序和查找
排序(Sort)是将无序的记录序列(或称文件)调整成有序的序列。
常见排序方法:
- 冒泡排序
冒泡排序是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。
1 # 冒泡 2 def bubble(list_): 3 # 外层循环表达比较多少轮 4 for i in range(len(list_) - 1): 5 #内层循环把控比较次数 6 for j in range(len(list_) - 1 - i): 7 if list_[j] > list_[j + 1]: 8 list_[j],list_[j + 1] = \ 9 list_[j + 1],list_[j]
- 选择排序
工作原理为,首先在未排序序列中找到最小元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小元素,然后放到排序序列末尾。以此类推,直到所有元素均排序完毕。
1 # 选择 2 def select(list_): 3 # 外层循环控制比较多少轮 4 for i in range(len(list_) - 1): 5 min = i # 假定list_[i] 为最小值 6 for j in range(i+1,len(list_)): 7 if list_[min] > list_[j]: 8 min = j 9 # 如果i不是最小值则交换 10 if min != i: 11 list_[i],list_[min] = \ 12 list_[min],list_[i]
- 插入排序
对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上,通常在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间。
1 # 插入 2 def insert(list_): 3 # 控制每次x选取的待插入数值 4 for i in range(1,len(list_)): 5 x = list_[i] # 选取待处理的数 6 j = i - 1 7 while j >=0 and list_[j] > x: 8 list_[j + 1] = list_[j] 9 j -= 1 10 list_[j + 1] = x
- 快速排序
步骤:
从数列中挑出一个元素,称为 "基准"(pivot),
重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作。
递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。
1 # 完成一轮排序过程 2 def sub_sort(list_,low,high): 3 # 基准数 4 x = list_[low] 5 while low < high: 6 # 后面的数小于x放到前面的空位 7 while list_[high] >= x and high > low: 8 high -= 1 9 list_[low] = list_[high] # 将数往前甩 10 while list_[low] < x and low < high: 11 low += 1 12 list_[high] = list_[low] 13 list_[low] = x # 将基准数插入 14 return low 15 16 17 # 快排 low 第一个数序列号 high 最后一个数序列号 18 def quick(list_,low,high): 19 if low < high: 20 key = sub_sort(list_,low,high) 21 quick(list_,low,key - 1) 22 quick(list_, key+1, high)
查找(或检索)是在给定信息集上寻找特定信息元素的过程。
二分法查找
当数据量很大适宜采用该方法。采用二分法查找时,数据需是排好序的。
1 # 对有序数列进行二分查找 2 def search(list_,key): 3 low,high = 0,len(list_) - 1 4 while low <= high: 5 mid = (low + high) // 2 6 if list_[mid] < key: 7 low = mid + 1 8 elif list_[mid] > key: 9 high = mid - 1 10 else: 11 return mid 12 13 l = [1,2,3,4,5,6,7,8,9,10] 14 print("Key index is:",search(l,12))