冒泡排序(Bubble Sort)也是一种简单直观的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢"浮"到数列的顶端。
上代码 ipython3交互模式下
In [1]: def bubble(list_): ...: # 外层循环表达比较多少轮 ...: for i in range(len(list_) - 1): ...: # 内层循环把控比较次数 ...: for j in range(len(list_) - 1 - i): ...: if list_[j] > list_[j + 1]: ...: list_[j], list_[j + 1] = \ ...: list_[j + 1], list_[j] ...: In [2]: l = [3, 7, 6, 5, 8, 3, 4, 2] In [3]: bubble(l) In [4]: print(l) [2, 3, 3, 4, 5, 6, 7, 8]选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理如下。首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。
In [1]: l = [3, 7, 6, 5, 8, 3, 4, 2] In [2]: def select(list_): ...: # 外层循环控制比较多少轮 ...: for i in range(len(list_) - 1): ...: min = i # 假定list_[i] 为最小值 ...: for j in range(i + 1, len(list_)): ...: if list_[min] > list_[j]: ...: min = j ...: # 如果i不是最小值则交换 ...: if min != i: ...: list_[i], list_[min] = \ ...: list_[min], list_[i] ...: In [3]: select(l) In [4]: l Out[4]: [2, 3, 3, 4, 5, 6, 7, 8]插入排序(英语:Insertion Sort)是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。
pycharm 环境下
l = [3, 7, 6, 5, 8, 3, 4, 2] # 插入 def insert(list_): # 控制每次x选取的待插入数值 for i in range(1, len(list_)): x = list_[i] # 选取待处理的数 j = i - 1 while j >= 0 and list_[j] > x: list_[j + 1] = list_[j] j -= 1 list_[j + 1] = x insert(l) print(l) // 输出 :[2, 3, 3, 4, 5, 6, 7, 8]快速排序使用分治法(Divide and conquer)策略来把一个序列(list)分为较小和较大的2个子序列,然后递归地排序两个子序列。 步骤为: 挑选基准值:从数列中挑出一个元素,称为"基准"(pivot); 分割:重新排序数列,所有比基准值小的元素摆放在基准前面,所有比基准值大的元素摆在基准后面(与基准值相等的数可以到任何一边)。在这个分割结束之后,对基准值的排序就已经完成; 递归排序子序列:递归地将小于基准值元素的子序列和大于基准值元素的子序列排序。 递归到最底部的判断条件是数列的大小是零或一,此时该数列显然已经有序。 选取基准值有数种具体方法,此选取方法对排序的时间性能有决定性影响。
图2
# 快排 low 第一个数序列号 high 最后一个数序列号 def quick(list_, low, high): if low < high: key = sub_sort(list_, low, high) quick(list_, low, key - 1) quick(list_, key + 1, high) # 完成一轮排序过程 def sub_sort(list_, low, high): # 基准数 x = list_[low] while low < high: # 后面的数小于x放到前面的空位 while list_[high] >= x and high > low: high -= 1 list_[low] = list_[high] # 将数往前甩 while list_[low] < x and low < high: low += 1 list_[high] = list_[low] list_[low] = x # 将基准数插入 return low l = [3, 7, 6, 5, 8, 3, 4, 2] quick(l, 0, 7) print(l) // 输出结果:[2, 3, 3, 4, 5, 6, 7, 8]