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))
二分查找代码
posted @ 2019-06-07 17:30  maplethefox  阅读(653)  评论(0编辑  收藏  举报