zoukankan      html  css  js  c++  java
  • 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))
    二分查找代码
  • 相关阅读:
    高盛、沃尔玛 题做出来还挂了的吐槽
    amazon师兄debrief
    到所有人家距离之和最短的中点 296. Best Meeting Point
    问问题没人回答的情况怎么办终于有解了
    找名人 277. Find the Celebrity
    数组生存游戏 289. Game of Life
    547. Number of Provinces 省份数量
    428. Serialize and Deserialize Nary Tree 序列化、反序列化n叉树
    alias别名简介和使用
    面试官:线程池执行过程中遇到异常会发生什么,怎样处理? Vincent
  • 原文地址:https://www.cnblogs.com/maplethefox/p/10988716.html
Copyright © 2011-2022 走看看